Add rust roadmap

pull/4696/head
Kamran Ahmed 11 months ago
parent 5ed49b965c
commit 277713e16b
  1. 4
      scripts/roadmap-content.cjs
  2. 4
      src/data/roadmaps/rust/content/100-introduction/100-what-is-rust.md
  3. 4
      src/data/roadmaps/rust/content/100-introduction/101-why-rust.md
  4. 4
      src/data/roadmaps/rust/content/100-introduction/102-memory-safety.md
  5. 4
      src/data/roadmaps/rust/content/100-introduction/103-installing-rust.md
  6. 4
      src/data/roadmaps/rust/content/100-introduction/104-ides-and-rust.md
  7. 4
      src/data/roadmaps/rust/content/100-introduction/105-rust-repl.md
  8. 3
      src/data/roadmaps/rust/content/100-introduction/index.md
  9. 4
      src/data/roadmaps/rust/content/101-language-basics/100-syntax/101-variables.md
  10. 4
      src/data/roadmaps/rust/content/101-language-basics/100-syntax/102-control-flow.md
  11. 4
      src/data/roadmaps/rust/content/101-language-basics/100-syntax/103-functions.md
  12. 4
      src/data/roadmaps/rust/content/101-language-basics/100-syntax/104-pattern-matching.md
  13. 4
      src/data/roadmaps/rust/content/101-language-basics/100-syntax/index.md
  14. 4
      src/data/roadmaps/rust/content/101-language-basics/101-ownership/100-rules.md
  15. 4
      src/data/roadmaps/rust/content/101-language-basics/101-ownership/101-borrowing.md
  16. 4
      src/data/roadmaps/rust/content/101-language-basics/101-ownership/102-stack-heap.md
  17. 4
      src/data/roadmaps/rust/content/101-language-basics/101-ownership/index.md
  18. 2
      src/data/roadmaps/rust/content/101-language-basics/102-constructs/100-enums.md
  19. 2
      src/data/roadmaps/rust/content/101-language-basics/102-constructs/101-structs.md
  20. 2
      src/data/roadmaps/rust/content/101-language-basics/102-constructs/102-traits.md
  21. 3
      src/data/roadmaps/rust/content/101-language-basics/102-constructs/103-impl-blocks.md
  22. 2
      src/data/roadmaps/rust/content/101-language-basics/102-constructs/index.md
  23. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/100-integers.md
  24. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/101-floats.md
  25. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/102-boolean.md
  26. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/103-character.md
  27. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/104-tuple.md
  28. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/105-array.md
  29. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/106-vector.md
  30. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/107-string.md
  31. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/108-hashmap.md
  32. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/109-hashset.md
  33. 4
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/110-linked-list.md
  34. 4
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/111-binary-heap.md
  35. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/112-stack.md
  36. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/113-queue.md
  37. 4
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/114-btree-map.md
  38. 4
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/115-btree-set.md
  39. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/116-rc.md
  40. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/117-arc.md
  41. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/118-mutex.md
  42. 4
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/119-rwlock.md
  43. 2
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/120-channels.md
  44. 12
      src/data/roadmaps/rust/content/101-language-basics/103-data-structures/index.md
  45. 4
      src/data/roadmaps/rust/content/101-language-basics/index.md
  46. 4
      src/data/roadmaps/rust/content/102-error-handling/100-option.md
  47. 4
      src/data/roadmaps/rust/content/102-error-handling/101-propagating.md
  48. 4
      src/data/roadmaps/rust/content/102-error-handling/102-custom-error.md
  49. 4
      src/data/roadmaps/rust/content/102-error-handling/index.md
  50. 4
      src/data/roadmaps/rust/content/103-modules-and-crates/100-code-organization.md
  51. 4
      src/data/roadmaps/rust/content/103-modules-and-crates/101-dependency-mgmt.md
  52. 4
      src/data/roadmaps/rust/content/103-modules-and-crates/102-publishing.md
  53. 4
      src/data/roadmaps/rust/content/103-modules-and-crates/index.md
  54. 4
      src/data/roadmaps/rust/content/104-concurrency-parallelism/100-futures.md
  55. 4
      src/data/roadmaps/rust/content/104-concurrency-parallelism/101-atomic-operations.md
  56. 4
      src/data/roadmaps/rust/content/104-concurrency-parallelism/102-threads.md
  57. 4
      src/data/roadmaps/rust/content/104-concurrency-parallelism/index.md
  58. 4
      src/data/roadmaps/rust/content/105-traits-generics/100-trait-def.md
  59. 4
      src/data/roadmaps/rust/content/105-traits-generics/101-trait-bounds.md
  60. 4
      src/data/roadmaps/rust/content/105-traits-generics/102-advanced-generics.md
  61. 4
      src/data/roadmaps/rust/content/105-traits-generics/index.md
  62. 4
      src/data/roadmaps/rust/content/106-lifetimes-borrow/100-explicit-lifetime.md
  63. 4
      src/data/roadmaps/rust/content/106-lifetimes-borrow/101-lifetime-elision.md
  64. 4
      src/data/roadmaps/rust/content/106-lifetimes-borrow/102-covariant.md
  65. 4
      src/data/roadmaps/rust/content/106-lifetimes-borrow/index.md
  66. 4
      src/data/roadmaps/rust/content/107-macros/100-declarative.md
  67. 4
      src/data/roadmaps/rust/content/107-macros/101-procedural.md
  68. 4
      src/data/roadmaps/rust/content/107-macros/102-domain-specific.md
  69. 4
      src/data/roadmaps/rust/content/107-macros/index.md
  70. 2
      src/data/roadmaps/rust/content/108-web-development/100-rocket.md
  71. 2
      src/data/roadmaps/rust/content/108-web-development/101-warp.md
  72. 2
      src/data/roadmaps/rust/content/108-web-development/102-actix.md
  73. 2
      src/data/roadmaps/rust/content/108-web-development/103-yew.md
  74. 4
      src/data/roadmaps/rust/content/108-web-development/index.md
  75. 2
      src/data/roadmaps/rust/content/109-async-programming/100-tokio.md
  76. 4
      src/data/roadmaps/rust/content/109-async-programming/101-async-std.md
  77. 4
      src/data/roadmaps/rust/content/109-async-programming/102-smol.md
  78. 4
      src/data/roadmaps/rust/content/109-async-programming/index.md
  79. 4
      src/data/roadmaps/rust/content/110-networking/100-reqwest.md
  80. 4
      src/data/roadmaps/rust/content/110-networking/101-hyper.md
  81. 4
      src/data/roadmaps/rust/content/110-networking/102-quinn.md
  82. 2
      src/data/roadmaps/rust/content/110-networking/index.md
  83. 2
      src/data/roadmaps/rust/content/111-serialization/100-serde.md
  84. 4
      src/data/roadmaps/rust/content/111-serialization/101-json-rust.md
  85. 4
      src/data/roadmaps/rust/content/111-serialization/102-toml-rs.md
  86. 4
      src/data/roadmaps/rust/content/111-serialization/index.md
  87. 2
      src/data/roadmaps/rust/content/112-database-orm/100-diesel.md
  88. 4
      src/data/roadmaps/rust/content/112-database-orm/101-sqlx.md
  89. 4
      src/data/roadmaps/rust/content/112-database-orm/102-rusqlite.md
  90. 4
      src/data/roadmaps/rust/content/112-database-orm/index.md
  91. 4
      src/data/roadmaps/rust/content/113-cryptography/100-ring.md
  92. 4
      src/data/roadmaps/rust/content/113-cryptography/101-rust-crypto.md
  93. 4
      src/data/roadmaps/rust/content/113-cryptography/102-sodiumoxide.md
  94. 2
      src/data/roadmaps/rust/content/113-cryptography/index.md
  95. 4
      src/data/roadmaps/rust/content/114-cli-utils/100-clap.md
  96. 4
      src/data/roadmaps/rust/content/114-cli-utils/101-structopt.md
  97. 4
      src/data/roadmaps/rust/content/114-cli-utils/102-termion.md
  98. 4
      src/data/roadmaps/rust/content/114-cli-utils/index.md
  99. 4
      src/data/roadmaps/rust/content/115-game-dev/100-bevy.md
  100. 4
      src/data/roadmaps/rust/content/115-game-dev/101-fyrox.md
  101. Some files were not shown because too many files have changed in this diff Show More

@ -59,9 +59,9 @@ function writeTopicContent(currTopicUrl) {
const roadmapTitle = roadmapId.replace(/-/g, ' ');
let prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${childTopic}". Write me a brief paragraph for that. Content should be in markdown. I already know the benefits of each so do not add benefits in the output.`;
let prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${childTopic}". Write me a brief paragraph for that. Your output should be strictly markdown. Do not include anything other than the description in your output. I already know the benefits of each so do not add benefits in the output.`;
if (!childTopic) {
prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${parentTopic}". Write me a brief paragraph for that. Content should be in markdown. I already know the benefits of each so do not add benefits in the output.`;
prompt = `I am reading a guide about "${roadmapTitle}". I am on the topic "${parentTopic}". I want to know more about "${parentTopic}". Write me a brief paragraph for that. Your output should be strictly markdown. Do not include anything other than the description in your output. I already know the benefits of each so do not add benefits in the output.`;
}
console.log(`Generating '${childTopic || parentTopic}'...`);

@ -1 +1,3 @@
# What is rust
# What is Rust?
Rust is a modern system programming language focused on performance, safety, and concurrency. It accomplishes these goals without having a garbage collector, making it a useful language for a number of use cases other languages aren’t good at. Its syntax is similar to C++, but Rust offers better memory safety while maintaining high performance.

@ -1 +1,3 @@
# Why rust
# Why use Rust?
Rust is a systems programming language that aims to provide memory safety, concurrency, and performance with a focus on zero cost abstractions. It was originally created by Graydon Hoare at Mozilla Research, with contributions from Brendan Eich, the creator of JavaScript. Rust is appreciated for the solutions it provides to common programming language issues. Its emphasis on safety and speed, the support for concurrent programming, along with a robust type system are just a few reasons why developers choose Rust.

@ -1 +1,3 @@
# Memory safety
# Memory Safety and Zero-Cost Abstractions
Rust, a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. It is graced with the feature of "memory safety without garbage collection", an attribute that makes Rust one of its kind. Memory safety is ensuring that software, while accessing the system's memory, is not causing any leaks, or dangling pointers. In Rust, memory safety is accomplished through a system of ownership with a set of rules that the compiler checks at compile time. This system eliminates the need of garbage collection or manual memory management, hence ensuring swift execution of software along with a safer memory environment. This memory management feature in Rust even provides concurrent programming guaranteeing thread safety with options for shared and mutable state access that makes it harder to cause thread unsafety.

@ -1 +1,3 @@
# Installing rust
# Installing Rust and Cargo
To install Rust, navigate to the official website at [https://www.rust-lang.org](https://www.rust-lang.org) and download the appropriate installation file for your operating system. For UNIX systems like Linux and MacOS, installation is as easy as running a single command in the terminal. For Windows, you'll be provided with a '.exe' installer which you need to execute. Further instructions can be found on the download page of the website. Keep in mind that you'll also need a linker of your operating system such as 'gcc'. You can update your Rust version at any time by running `rustup update` in the terminal.

@ -1 +1,3 @@
# Ides and rust
# IDEs and Rust Toolchains
For the Rust Programming Language, several Integrated Development Environments (IDEs) and editors provide great support. [Visual Studio Code](https://code.visualstudio.com) is highly preferred among Rust developers due to its support for Rust via the "Rust Language Server" or "rust-analyzer" plugins. [IntelliJ-based IDEs](https://www.jetbrains.com/idea/) also support Rust through their plugin. Additionally, [Sublime Text](https://www.sublimetext.com) and [Atom](https://atom.io) with respective Rust-enhancement plugins are also used. For a more terminal-centric approach, [Vim](https://www.vim.org) and [Emacs](https://www.gnu.org/software/emacs/) are equipped with Rust modes. These IDEs and editors offer various features like auto-completion, syntax highlighting, and tools for debugging which prove useful for Rust programming.

@ -1 +1,3 @@
# Rust repl
# Rust REPL (Rust Playground)
`Rust REPL` (Read-Eval-Print-Loop) is an interactive shell in which you can write and test Rust snippets in real-time. Unlike running a program normally in Rust where you have to manually compile and then run the program, in REPL the inputs are automatically evaluated, and the result is returned immediately after execution. This is helpful when experimenting with Rust code, learning the language, and debugging. REPL isn't built into Rust directly but is available via third-party tools such as `evcxr_repl`.

@ -1 +1,4 @@
# Introduction
Rust is a modern system programming language focused on performance, safety, and concurrency. It accomplishes these goals without having a garbage collector, making it a useful language for a number of use cases other languages aren’t good at. Its syntax is similar to C++, but Rust offers better memory safety while maintaining high performance.

@ -1 +1,3 @@
# Variables
# Variables, Constants, and Data Types
In Rust, variables are declared using the `let` keyword. They are immutable by default, which means once a value is bound to a variable, it cannot be changed. If you want to make a variable mutable, the `mut` keyword is used. So, if you wanted to declare a mutable variable `x` and assign it the value `5`, you would write `let mut x = 5;`. Variables can also be patterned. By default in Rust, variables are block-scoped. Rust also supports several types of variable attributes.

@ -1 +1,3 @@
# Control flow
# Control Flow Constructs
In Rust, control flow is managed through various structures like `if`, `else`, `while`, `for`, and `match`. The `if` and `else` structures are used to execute different blocks of code based on certain conditions. Similar to other languages, `while` and `for` are used for looping over a block of code. The `while` loop repeats a block of code until the condition is false, and the `for` loop is used to iterate over a collection of values like an array or a range. The `match` structure is a powerful tool in Rust which can be used for pattern matching. It goes through different cases and executes the block where the match is found.

@ -1 +1,3 @@
# Functions
# Functions and Method Syntax
In Rust, functions are declared using the `fn` keyword. Each function takes a set of input variables with their specified types and may optionally return a type. The body of the function is contained within curly braces `{}`. Unlike other languages, in Rust you don't need to end the statement with a semicolon if it’s the last one in a block, making it the implicit return. If we want to return a value, we simply write the expression we want to return. An example of a function in Rust is `fn add(one: i32, two: i32) -> i32 { one + two }` where `one` and `two` are parameters of type `i32` and the function returns an integer of type `i32`.

@ -1 +1,3 @@
# Pattern matching
# Pattern Matching and Destructuring
In Rust, `pattern matching` is a robust tool that allows you to destructure data types and perform conditional checks in a succinct and clear way. The main structures used for pattern matching are `match` and `if let`. The `match` keyword can be used to compare a value against a series of patterns and then execute code based on which pattern matches. Patterns can be made up of literal values, variable names, wildcards, and many other things. The `if let` allows you to combine `if` and `let` into a less verbose way to handle values that match a specific pattern. It's basically a nice syntax sugar over a `match` statement.

@ -1 +1,3 @@
# Syntax
# Syntax and Semantics
Rust's syntax aims for readability and avoids visual clutter. It places a great deal of importance on forward compatibility, even when it occasionally hinders feature additions. Most Rust syntax is based on the same basic principles. Understanding a handful of concepts allows a broad understanding of the structure of most Rust programs. Some of these concepts include item declarations and pattern matching. In Rust, you typically declare an item once and then refer to it by its name. Pattern matching is a fundamental and powerful part of Rust’s syntax, allowing you to branch your code based on the structure of data, not just its value or type.

@ -1 +1,3 @@
# Rules
# Ownership Rules and Memory Safety
In Rust, the concept of ownership is described by three main rules. Firstly, each value in Rust has a variable that is called its owner. Secondly, there can only ever be one owner at a time. This prevents multiple parts of the code from trying to modify the data at once, potentially causing data races and inconsistencies. Lastly, when the owner goes out of scope, the value will be dropped. This ensures that Rust cleans up the allocated memory and other resources once they’re no longer required, thereby avoiding memory leaks.

@ -1 +1,3 @@
# Borrowing
# Borrowing, References, and Slices
In Rust, "borrowing" is a technique which allows you to access the data of a particular value while the owner retains control. There are two types of borrowing: mutable and immutable. Immutable borrowing means an owner can fondly permit several read-only borrows of a value at the same time as long as the value doesn't change. On the other hand, mutable borrowing allows only a single borrower at a time who can potentially modify the value. This practice is essential in maintaining the concept of ownership without violating any of its rules and avoiding the problem of dangling references.

@ -1 +1,3 @@
# Stack heap
# Deep Dive: Stack vs Heap
In most modern computer systems, memory management is split into two main parts: the stack and the heap. The **stack** is a section of memory that grows and shrinks automatically as functions are called and return. The data stored on the stack must have a known, fixed size. The **heap** is a section of memory that is used for data that needs to persist for longer than a single function-call. Data with dynamic size is stored on the heap. Rust, like many languages, has facilities for using these two types of memory, allowing developers fine-tuned control over memory usage.

@ -1 +1,3 @@
# Ownership
# Onwnership System
In Rust, the concept of `Ownership` is a key feature that governs how memory management works. Each value in Rust has its own designated owner and there can be only one owner for a value at a time. When the owner goes out of scope, the value would be automatically dropped. The three main facets of ownership include ownership rules, `borrowing` and `slices`. Ownership rules play a key role in system performance and prevention of issues like null or dangling references. `Borrowing` is a mechanism where we allow something to reference a value without taking ownership. Finally, `slices` are a data type that does not have ownership and helps in making a reference to a portion of a collection.

@ -1 +1,3 @@
# Enums
Enums, short for enumerations, allow you to define a type by enumerating its possible variants. An instance of an enum type could be any one of these variants, and in Rust, enums are incredibly versatile. Unlike enumerations in some other languages, these variants aren't restricted to a singular data type. You can attach data to each variant of the enum, and the data could have different types and amounts for each variant. It's also possible to embed structs and even other enums. Enums in Rust also enable pattern-matching, which allows you to compare a value to a series of patterns, handle it if it matches one of them, and execute code based on which pattern has been matched.

@ -1 +1,3 @@
# Structs
In Rust, `struct` is a custom data type used for grouping related values together into one entity. It is similar to classes in other programming languages. Essentially, they create a new type that we can use to streamline complex data handling. There are three types of `struct` in Rust - classic `C` structs, tuple structs, and unit structs. Classic `C` structs are named-field struct and are the most commonly used. Tuple struct, while not being common, are useful when you want to couple together a few data points. Unit structs are useful in situations where you want to implement a trait on some type but don’t have any data that you want to store in the type itself.

@ -1 +1,3 @@
# Traits
Traits in Rust programming language define shared behaviors. They are a way to group method signatures together to define a set of behaviors required by a type. Anything with a certain trait will have the behavior of that trait's methods. Traits are abstract, and it's not possible as such to create instances of traits. However, we can define pointers of trait types, and these can hold any implementer of the trait. A trait is implemented for something else, which can be a concrete type or another trait.

@ -0,0 +1,3 @@
# Impl Blocks
Impl Block in rust is used to implement a trait or a struct. It is used to define the behavior of a trait or a struct.

@ -1 +1,3 @@
# Constructs
In Rust, "constructs" refer to different elements used to build the structure of the program. This includes variables, functions, data types, control flow statements, and more. **Variables** store data, and their mutable or immutable status is determined at their declaration. **Functions** are reusable blocks of code defined by the `fn` keyword. Data types in Rust are static and must be declared upfront. These include simple ones like integers, boolean, float, etc, and complex types like arrays, tuples etc. **Control Flow** structures help direct the flow of execution. These include `if`, `else`, `loop`, `while`, `for`, and more. Exception handling uses the `Result` and `Option` enums along with the `match` construct. Rust's constructs like these come together to structure your program in a safe yet efficient manner.

@ -1 +1,3 @@
# Integers
In Rust, integers are a primitive data type that hold whole number values, both positive and negative. Integer types in Rust can be divided into two subcategories: signed and unsigned. Signed integers are those that can hold negative, zero, and positive values whereas unsigned integers only hold zero and positive values. They are denoted by "i" and "u" respectively followed by a number which represents the number of bits they occupy in memory. The available integer types are `i8`, `i16`, `i32`, `i64`, `i128` and `isize` (signed), and `u8`, `u16`, `u32`, `u64`, `u128` and `usize` (unsigned). In these types, the number after "i" or "u" denotes the size of the integer type in bits. The `isize` and `usize` types depend on the kind of computer your program is running on: 64 bits on a 64-bit architecture and 32 bits on a 32-bit architecture.

@ -1 +1,3 @@
# Floats
In Rust, `floats` are used to represent floating-point numbers. They are defined as numerical values with fractional components. Rust supports two types of floating-point numbers: `f32` and `f64`. These are 32-bit and 64-bit in size, respectively. `f32` is a single-precision float, while `f64` has double precision. The default type is `f64` because on modern CPUs it’s roughly the same speed as `f32` but allows more precision. You can define a float in Rust like so: `let x: f32 = 3.0;`.

@ -1 +1,3 @@
# Boolean
`Boolean` in Rust is a basic data type that encapsulates the truth value. It is represented by `bool` keyword and can hold two values either `true` or `false`. Rust includes `boolean` as its primitive data type and operations like logical `AND (&&)`, logical `OR (||)`, and logical `NOT (!)` can be performed on these types of values. Boolean is primarily used in conditional statements like `if`, `while` etc. For example, `let is_raining: bool = true;` where `is_raining` is a boolean variable holding the value `true`.

@ -1 +1,3 @@
# Character
In Rust, the `char` keyword is used to denote a character type. A `char` in Rust represents a Unicode Scalar Value, which means it can represent a lot more than just ASCII. Accented letters, Chinese/Japanese/Korean ideographs, emoji, and zero width spaces are all valid `char` Types in Rust. It uses 4 bytes to store a single character. It is defined with single quotes like `let x: char = 'z';`.

@ -1 +1,3 @@
# Tuple
In Rust, a **Tuple** is a type of data structure that holds a finite number of elements, each having potentially different types. Elements in a tuple are accessed using a dot (`.`) followed by the index of the value we want to get. For example, to declare a tuple that includes a `32-bit integer`, a `single-byte unsigned integer`, and a `floating point number`, we would write `let my_tuple: (i32, u8, f64) = (500, 2, 20.5);` The index of elements in a tuple start from `0`. So, to access the first element, use `my_tuple.0`, the second element `my_tuple.1`, and so on. Tuples can also be used for multiple declarations and assignments. Tuples are particularly useful when you want to group together items of different types.

@ -1 +1,3 @@
# Array
In Rust, an `array` is a collection of elements of the same type, organized consecutively in memory. Unlike some other data structures in Rust, the size of an array must be known at compile time. This gives it a distinct advantage in memory efficiency. The size of the array cannot be changed after it has been declared. The syntax to declare an array in Rust is as follows: `let array_name: [type; size] = [elements];`. Here, `type` represents the data type of the elements, `size` is the number of elements and `elements` are the data held in the array. For example: `let numbers: [i32; 5] = [1, 2, 3, 4, 5];`. Elements in an array can be accessed using their indices, starting from 0. For instance, `numbers[0]` will return the first element `1` in the `numbers` array.

@ -1 +1,3 @@
# Vector
A `Vector` in Rust, often referred to as `Vec`, is a growable, or dynamically-sized, array-like data structure that can store homogeneous types. It stores elements of the same type in a contiguous block of memory, with the count of elements and capacity managed automatically by Rust. Unlike arrays, vectors do not need to have a predetermined size at compile time and their size can be increased or decreased at runtime. The `Vec<T>` holds its data on the heap. It maintains a pointer to the data, a length, and a capacity. The length is the number of elements currently stored in the vector, while the capacity is the total allocation in the memory. The key methods for a `Vec<T>` include `push()`, `pop()`, and `len()`, among others.

@ -1 +1,3 @@
# String
In Rust, `String` is a growable, mutable, owned, UTF-8 encoded string type. When Rustaceans refer to 'strings' in Rust, they usually mean the `String` and the string slice `str` types, not just one of those types. Both types are UTF-8 encoded. A `String` in Rust is similar to a string in other languages, but is not null-terminated at the end. Creation of a `String` can be done from a literal string with `String::from("Hello, world!")` or by converting a string slice with `"Hello, world!".to_string()`. String concatenations and manipulations are achieved via a multitude of methods such as `push_str()`, `push()`, `+` operator, `format!()` macro, etc.

@ -1 +1,3 @@
# Hashmap
The `HashMap` in Rust is part of the standard library's collections framework and it's a generic collection of key-value pairs. It allows for the quick lookup, insertion, and removal of items using hashing. A `HashMap<K, V>` holds a mapping of keys of type `K` to values of type `V`. The keys are unique and when a key gets inserted for the second time with a different value, the new value replaces the old value. Rust's `HashMap` uses a cryptographically strong hashing algorithm which can help avoid denial-of-service (DoS) attacks. It is however not ordered, so items may not be in the same order as they were inserted.

@ -1 +1,3 @@
# Hashset
`HashSet` in Rust is a collection of unique elements. It's a data structure which stores details in the form of key and value, and it uses `hashing` to store elements. It's implemented as a `hash table`, as it makes use of a hasher to make the structure more secure against collision attacks. A `HashSet` only contains keys, associating the value portion of the map with a dummy unit. The value of `HashSet` returns an iterator over the elements of the set and these elements are arbitrary and not in any specific order.

@ -1 +1,3 @@
# Linked list
# LinkedList
The **Linked List** in Rust is a sequence of nodes where each node consists of a value and a pointer/reference to the next node in the sequence. Linked Lists are primarily used for implementing higher level data structures such as stacks, queues and associative arrays. Rust's `std::collections` provides a `LinkedList` struct that is a doubly-linked list with O(1) insertion and removal at both the front and back, but with O(n) indexing.

@ -1 +1,3 @@
# Binary heap
# BinaryHeap
A `Binary Heap` is a complete binary tree which is either Min Heap or Max Heap. In a Max Binary Heap, the key at root must be maximum among all other keys present in Binary Heap. The same property must be recursively true for all nodes in Binary Tree. Min Binary Heap is similar to Max Binary Heap. But in a Min Binary Heap, the key at root must be minimum among all other keys present in Binary Heap. This property must be recursively true for all nodes in Binary Tree. Binary Heaps have efficient implementations on arrays.

@ -1 +1,3 @@
# Stack
The **Stack** is a fundamental data structure in Rust, which is based on the principle of Last-In-First-Out (LIFO). In other words, elements that are added last are the first ones to be removed. This is functionally similar to a real-world stack, such as a stack of plates. One key aspect of stacks in Rust is that they are bounded to a certain size at compile-time. This implies that stack size does not grow or shrink dynamically. In Rust, function calls are operated using stack with each call pushing a new stack frame to the end, and each return statement popping one off. Stack Overflow occurs when too much of the stack is used.

@ -1 +1,3 @@
# Queue
In Rust, a Queue is another important linear data structure which follows a particular order in which the operations are performed. The order given to the elements follows the FIFO (First In First Out) approach. There are no direct standard library data structures meant solely to act as a Queue in Rust, but we can obtain queue-like behaviors using other provided data structures. More commonly, the VecDeque structure is used as a Queue. It supports constant time element insertion and removal at both ends. The 'push_back' and 'pop_front' functions essentially form a Queue structure.

@ -1 +1,3 @@
# Btree map
# BTreeMap
In Rust, `BTreeMap` is a generic collection that stores data in a sorted tree structure. More specifically, it uses a self-balancing binary search tree (a type of `B+-tree`). `BTreeMap`s implement the `Map` trait, including methods such as `get`, `insert`, `remove`, and many others. The data stored in a `BTreeMap` will be sorted by key, which allows efficient lookup, insertions, and removals. The keys of the `BTreeMap` must implement the `Ord` trait, which means they must be orderable. Because `BTreeMap`s store data in a sorted order, the iteration of keys and values will be in sorted order as well.

@ -1 +1,3 @@
# Btree set
# BTreeSet
`BTreeSet` in Rust is a data structure that implements a set backed by a BTree. Its functionality is similar to that of other set data structures in that it maintains a collection of unique elements and allows for operations like insertion, removal, and querying. But the elements in a `BTreeSet` are sorted according to an ordering relation, which may be customized by the user. The sorting enables efficient range queries as well as other operations such as finding the minimum or maximum element.

@ -1 +1,3 @@
# Rc
`Rc` stands for Reference Counting, a data type in Rust that allows multiple owners for the same data on the heap while keeping track of the number of references to that data. If there are zero references to data, the value can be cleaned up without any references becoming invalid. Avoiding these problems comes at the cost of some memory overhead, because `Rc` keeps track of the total number of references which means it needs to allocate memory to keep the count.

@ -1 +1,3 @@
# Arc
`Arc` in Rust stands for "Atomic Reference Counting". It is a thread-safe reference-counting type used for sharing immutable data between multiple parts of the system. With `Arc`, we can have multiple references to the same data which is useful for concurrent programming. When the last reference to a type is gone, the `Arc` will clean up the underlying data. Unlike `Rc` (Reference Counting), which is single-threaded, `Arc` uses atomic operations for incrementing and decrementing the reference count hence making it safe to share across threads.

@ -1 +1,3 @@
# Mutex
`Mutex` or "Mutual Exclusion" in Rust is a concurrency primitive that is used to protect shared data from being concurrently accessed by multiple threads. When one thread starts using a `Mutex`, other threads have to wait until the Mutex is unlocked. When a thread has finished handling the shared data, it should unlock the `Mutex` to allow other threads to access the shared data. If not properly handled, it could lead to a software deadlock or other timing-related issues. Rust's Mutex has a built-in safeguard against these problems – if a thread that is holding a Mutex crashes, Rust will automatically unlock the Mutex.

@ -1 +1,3 @@
# Rwlock
# RwLock
`RwLock` in Rust stands for Read/Write lock, which is a type of synchronization primitive. It is an advanced version of the Mutex data structure. Unlike Mutex, which only allows one thread to access the data, `RwLock` allows multiple threads to read data at the same time but only one thread to write. If a thread is writing, no other thread can read or write. The syntax for declaring `RwLock` is `let lock = RwLock::new(value)`. Please remember that a potential downside of `RwLock` is lock contention, making sure to properly manage read-write access. The appropriate use of `RwLock` can enable better performance for workloads that involve heavy reading.

@ -1 +1,3 @@
# Channels
Channels in Rust allow communication between threads. They are a programming paradigm that is part of the message passing concurrency model. Channels are used to send and receive values between threads, ensuring thread safety by avoiding shared state. Rust channels have two parts - `Sender` and `Receiver`. `Sender` is used for sending data, and `Receiver` is used to read the data. This model follows the 'multiple producer, single consumer' rule, meaning it can have multiple sending ends but only one receiving end. Channels in Rust are provided by the `std::sync::mpsc` module, where mpsc stands for Multiple Producer, Single Consumer.

@ -1 +1,11 @@
# Data structures
# Data Structures
In Rust, there are different types of data structures for organizing and storing data. Some of the primary types include:
- **Structures (structs)**: These are custom data types that allow you to combine multiple related values of different types. Structs implement methods and can also maintain private fields. Structs come in three types: classic C-style structs, tuple structs, and unit structs.
- **Tuples**: These are a sequence of fixed-size elements of possibly differing types. The elements of a tuple can be accessed using dot notation followed by the index starting from 0.
- **Enums (enumerations)**: These are data structures that allow you to define a type by enumerating its possible variants. Enum variants can be simple values or complex ones with fields.
- **Arrays** and **Vectors**: These are collections of items with the same type. An array is fixed-sized, while a vector can grow or shrink its size. Arrays and vectors store elements in contiguous memory locations.
- **Hash Maps**: A Hash Map keeps track of elements in key-value pairs, similar to a dictionary or a JavaScript object. They are great for quick lookups.
The Rust language also provides powerful reference and borrowing mechanism to control memory, data read/write access, and mutation to avoid problems like data races in concurrent scenarios.

@ -1 +1,3 @@
# Language basics
# Language Basics
The "language basics" of Rust encompass the fundamental elements you'll need to grasp to get your programming underway. This commences with understanding Rust's syntax and semantics, followed by grasping variables and data types, which are essential in creating effective code. Rust language basics also incorporate concepts of control flow, such as loops and conditional statements. Lastly, functions are another vital element, providing you the ability to structure your code and reuse segments of it.

@ -1 +1,3 @@
# Option
# Option & Result Enumerations
`Option` is an enumeration, also known as an `enum`, in Rust with two variants: `Some(T)` and `None`. It is a flexible and safe alternative to using `null` values or exceptions for indicating that a value might not be present. If a function may not return a value for all possible input, it should return an `Option` value. `Some(T)` variant contains the valid value of type `T` and `None` variant indicates the absence of a value. You can perform various operations on `Option` values, such as method chaining and pattern matching, to effectively handle both states (value present or absent). The `Option` enum encourages you to consciously deal with the possibility of missing values and helps prevent unforeseen runtime errors.

@ -1 +1,3 @@
# Propagating
# Propagating Errors and `?` Operator
Propagating errors in Rust is about passing the error information from the function that failed to the function that called it. Using the `?` operator is one way to achieve this. This operator can only be used in functions that return `Result` or `Option` or another type that implements `std::ops::Try`. If the value of the `Result` is `Ok`, the value inside the `Ok` will get returned. If the value is `Err`, the `Err` will be returned from the whole function. Consequently, the error gets propagated to the calling function.

@ -1 +1,3 @@
# Custom error
# Custom Error Types and Traits
In Rust, you can define your own types of errors using the `enum` construct. This gives you the ability to specify different types of errors that your code can encounter, and attach additional information to them. To make your custom error type compatible with the rest of Rust's error handling machinery, you need to implement two traits: `std::fmt::Debug` and `std::fmt::Display`. There is also a third trait, `std::error::Error`, which can provide backtraces and the ability to have chained errors or causes. Furthermore, the `thiserror` library provides a convenient way to define custom error types with a simple annotation.

@ -1 +1,3 @@
# Error handling
# Error Handling
Error handling in Rust is achieved primarily through two types of results: the `Result<T, E>` and `Option<T>`. The `Result<T, E>` variant is used for functions that can result in an error. It has two variants, `Ok(T)` which indicates operation was successful and `Err(E)` when an error occurred. On the other hand, `Option<T>` is used for functions that can return a `none` value but not cause an error. This result type also has two variants, `Some(T)` indicates that the operation was successful and `None` specifies absence of a value. Rust's pattern matching features can be used to handle different types of errors thrown by these results. Furthermore, propagation of errors in Rust can be achieved using the `?` operator that returns early if the function fails. It's important to note that Rust does not have exceptions, thus eliminates the common problems associated with them.

@ -1 +1,3 @@
# Code organization
# Code Organization and Namespacing
In Rust, the fundamental structure for organizing your code is through using a **module** system and **crates**. A module in Rust allows grouping of related function definitions and struct definitions in a named scope. It’s defined using the `mod` keyword. The modules can also be nested and make code more concise, readable, and manageable. On the other hand, a **crate** is a binary or a library project in Rust. It's the largest compilation unit of Rust. It's a tree of modules that produces a library or executable. The crate root is a source file which the Rust compiler starts from and makes up the root module of your crate (e.g. `main.rs` or `lib.rs`).

@ -1 +1,3 @@
# Dependency mgmt
# Dependency Management with Cargo.toml
Dependency management in Rust is handled by a tool called Cargo. Cargo helps you manage your Rust projects, providing functionalities for building your code, downloading the libraries your project depends on, and building those libraries. These libraries are called *crates*. A crate is a package of Rust code. In your `Cargo.toml`, you list your dependencies in a [dependencies] section. You list libraries from crates.io by their name and version number. Cargo understands Semantic Versioning, a standard for writing version numbers.

@ -1 +1,3 @@
# Publishing
# Publishing to crates.io
Publishing in Rust involves packaging up your library or executable and making it available for others to use. To publish a crate, you'll need to create an account on [crates.io](https://crates.io/), the Rust package repository. If you haven't already, you'll need to format your project in a specific way, detailing needed information in a `Cargo.toml` file. Then, use the command `cargo publish` to upload your crate to the registry. Updates to your crate can be published with the same command, but be mindful that crates.io does not allow you to delete or overwrite an existing version of a crate. Make sure that everything is in order before you publish!

@ -1 +1,3 @@
# Modules and crates
# Modules and Crates
In Rust, a module is a namespace that contains definitions of functions or types. You can choose to make the definitions visible in other modules or not. This provides a method of encapsulation for your code. On the other hand, a crate is a binary or library. It is the smallest unit of compilation in Rust. A crate can link to other crates, and it is composed of many modules. Therefore, the module system allows for code organization within a crate, and the crate system allows for building and sharing functionality among multiple projects.

@ -1 +1,3 @@
# Futures
# Futures and Async/Await Paradigm
Futures in Rust represent values that might not have been computed yet. They are a way for the program to describe an operation that will be completed at some point in the future, or will complete asynchronously. They are a cornerstone of many async applications in Rust. A Future is an asynchronous computation that can produce a value (Ok-type) or an error (Err-type). The critical idea behind futures is that they can produce their value at some point in time, that "sometime" can be now, in the future, or never.

@ -1 +1,3 @@
# Atomic operations
# Atomic Operations and Memory Barriers
Atomic operations in Rust are low-level types that support lock-free concurrent programming. These operations are atomic because they complete in a single operation rather than being interruptible. In Rust, atomic types provide primitive shared-memory communication between threads, and can also be used for non-blocking data structures and are supported using machine instructions directly. They form the building blocks for other, higher-level concurrency abstractions. It includes variety of atomic operations such as `store`, `load`, `swap`, `fetch_add`, `compare_and_swap` and more, which are operations performed in a single, uninterrupted step.

@ -1 +1,3 @@
# Threads
# Threads, Channels, and Message Passing
Threads are the smallest unit of computing that can be scheduled by an operating system. They live in the context of a process, and each thread within a process shares the process's resources including memory and file handles. In Rust, the `std::thread` module allows you to have direct control over threads. This model of concurrency is known as 1:1, mapping one operating system thread to one language thread. You can write concurrent programs in Rust using threads in a similar way as most other languages. You start threads with `std::thread::spawn` and wait for them to finish with `join`.

@ -1 +1,3 @@
# Concurrency parallelism
# Concurrency and Parallelism
Concurrency and parallelism are two terms related to multitasking. In **concurrency**, tasks have the ability to run in an overlapping manner, which does not necessarily mean they run at the same exact time. It means the start and end times of the tasks intersect. On the other hand, **parallelism** is the process where several tasks are executed simultaneously. In the context of programming, especially in systems such as Rust, these concepts are exceptionally important. Understanding them is crucial to implementing complex algorithms and systems that benefit from the efficient use of resources, and most importantly, time.

@ -1 +1,3 @@
# Trait def
# Trait Definitions and Implementations
A `trait` definition in Rust is a way to define a set of behaviors necessary for a certain type. It is essentially an interface that types can implement. The `trait` def is created using the `trait` keyword followed by its name and the set of methods it includes enclosed in curly brackets. These methods are defined under the trait with their signature but without their implementation. Once a trait is defined, it can be implemented for any data type. Note that the type that this trait applies to is represented by the keyword `Self`. For example, `trait GetName { fn get_name(&self) -> String; }` defines a trait `GetName` with a method `get_name`. This trait can then be implemented for any type that needs the behaviour `get_name`.

@ -1 +1,3 @@
# Trait bounds
# Trait Bounds and Associated Types
Trait Bounds in Rust is a way of specifying that a generic must satisfy a certain trait. Essentially, a trait bound says something like: "T must support the following behavior". In other words, they allow you to use generic type parameters in your function definitions to specify that the function can accept any type as a parameter, as long as that type implements a certain trait. For instance, `T: Display` would constitute a trait bound, requiring the generic `T` to implement the `Display` trait. These trait bounds add a level of control and safety over the types that are passed as parameters, opening the possibility for a higher level of abstraction and code reuse.

@ -1 +1,3 @@
# Advanced generics
# Advanced Generics and Type-level Programming
Advanced generics in Rust offer a powerful set of tools for creating reusable and efficient code. The `where` syntax in generics can be used to specify trait and lifetime bounds, creating a more expressive declaration and avoiding numerous `T: Trait` inline annotations. Additionally, the `<T: ?Sized>` syntax allows for using dynamically sized types in generics. Advanced generics also allow for defining methods that apply to a subset of variations of generic types using an associated type. Furthermore, this allows for operator overloading through the use of associated types in traits, enhancing flexibility while retaining strong typing. Another advanced use of generics is 'higher kinded types', allowing a type constructor to take another type constructor as a parameter. This is the system Rust uses for handling `Option<T>`, `Result<T, E>`, and other similar types.

@ -1 +1,3 @@
# Traits generics
# Traits and Generics
Traits generics are a notable feature in Rust that pertain to defining shared behavior across data types. With them, you can specify placeholder types in trait definitions, letting you abstract over a range of possibilities. They're a means for defining shared behavior -- abstracting over functionality that types can have in common. You can apply traits to generics to constrain the types passed to the generic, hence permitting trait methods to be called on those types. You identify a generic parameter's type by the trait it implements, making it possible to use generic types in the trait methods. In essence, Rust achieves polymorphism through utilizing traits on generics.

@ -1 +1,3 @@
# Explicit lifetime
# Explicit Lifetime Annotations
In Rust, lifetimes are explicit and are determined at compile time. An `explicit lifetime` is one where lifetimes are annotated in function signatures. Explicit lifetimes are very important in situations where multiple references exist and Rust's compiler cannot make safe and correct assumptions on its own. They're denoted by a tick mark, followed by a lowercase letter. The most common default names for lifetimes are `'a`, `'b`, `'c`, etc. For example, in a function that borrows two strings, and returns a string, explicit lifetimes are used as: `fn longest<'a>(x: &'a str, y: &'a str) -> &'a str`. This allows the compiler to ensure that the references used in your function will remain valid for the entire time they're being used, preventing "dangling references".

@ -1 +1,3 @@
# Lifetime elision
# Lifetime Elision Rules
"Lifetime Elision" in Rust is an implicit annotation of lifetimes where the compiler tries to make an educated guess about the appropriate lifetimes. Rust compiler has a few rules that it applies in case of lifetime elision. Basic rules include that each parameter passed by reference gets its own lifetime and if there's exactly one input lifetime, that lifetime is assigned to all output lifetime parameters. The rules become more complex when dealing with methods. In these cases, there's a distinction between "self" and other parameters. With lifetime elision, the Rust compiler eliminates the necessity to specify lifetimes in every situation, producing cleaner and less cluttered code.

@ -1 +1,3 @@
# Covariant
# Covariant and Contravariant Lifetimes
In Rust, lifetime, type, and function parameter types can be covariant, invariant, or contravariant. Specifically, covariant describes the relationship between a complex type and a simpler type when the simpler type varies. Covariant occurs when the ordering of types is preserved, i.e., changing a type T to a subtype T' in a complex type C<T>, changes the complex type to a subtype C<T'>. In simpler terms, if type B is a subtype of type A, then a collection of B is a subtype of a collection of A, providing the collection type is covariant. This applies to `&T`, `*const T`, `Box<T>`, `[T]`, `[T; n]`, and `T` when they are function return types in Rust.

@ -1 +1,3 @@
# Lifetimes borrow
# Lifetimes and Borrow Checker
In Rust, the concept of "lifetimes" is associated with borrowed references. A lifetime is a scope for which that reference is valid. The Rust compiler uses lifetimes to ensure those references are always valid. That is, the referenced object will not get destroyed while references to that object exist. When you are explicitly working with lifetimes in Rust, you are usually dealing with functions that accept references. Rust requires you to annotate the lifetimes when a function has one or more arguments of the borrowed reference type. The annotation is done using a set of angle brackets (<>), and inside these brackets, you declare your lifetime parameters, prefixed with an apostrophe ('). The Rust compiler uses these annotations to reason about how those references relate, and whether they are valid or not.

@ -1 +1,3 @@
# Declarative
# Declarative Macros with macro_rules!
Rust supports two types of macros, one of which is known as "declarative macros" (or simply `macro_rules!`). Declarative macros in Rust allow you to define reusable chunks of code that have some variable parts, without having to write a full function or type out the same code every time. They work a lot like functions, except they operate at the syntax level rather than the semantics. The compiler expands declarative macros at compile-time, in essence, taking the code they define and “pasting” it directly into your source code. They are defined using the `macro_rules!` keyword, followed by a name and a block of code. The name is used to invoke the macro later in your code, and the block of code is the code that will get inserted every time the macro is used.

@ -1 +1,3 @@
# Procedural
# Procedural Macros and Custom Derive
Procedural macros in Rust allow you to define functions, or procedures, that operate on code at compile time. The input to these macros is a stream of tokens from the program text, and the output is a new stream of tokens that replace the macro invocation. They are defined in their own crates with a special crate type. There are three kinds of procedural macros: custom derive, attribute-like macros, and function-like macros. Custom derive macros let you define new behavior for the `derive` attribute. Attribute-like macros are invoked as item attributes, for example `#[foo(…)]`, and can be applied to any item that accepts attributes. Function-like macros look like function calls, but work with arbitrary tokens as input.

@ -1 +1,3 @@
# Domain specific
# Domain-Specific Languages (DSLs) in Rust
Domain Specific Languages (DSLs) are programming languages tailored to solve specific problems or tasks in an efficient manner. They are narrower in application than general-purpose languages because they are optimized for a specific domain or task. In Rust, Macros can be used to create DSLs due to their ability to define reusable syntax patterns and to effectively manipulate Rust syntax trees. This ability has led to a variety of domain-specific languages based on Rust macros, with applications ranging from game development to web application programming. Macros essentially allow Rust programmers to extend the language in ways that are tailor-made for their specific project or domain, hence creating domain-specific languages.

@ -1 +1,3 @@
# Macros
# Macros and Metaprogramming
Macros in Rust are a way to define reusable chunks of code. They're similar to functions in that they can accept input and produce output, but macros have a few key differences and advantages. With macros, you can write code that writes other code, which is known as metaprogramming. In comparison to functions, macros are more flexible and can accept a variety of different inputs. Macros are defined using the `macro_rules!` keyword and they use a different syntax than regular Rust functions. When you define a macro, you specify the code that should be inserted at compile time. The compiler then replaces all calls to the macro with the expanded macro code.

@ -1 +1,3 @@
# Rocket
"Rocket" is a web framework for the Rust programming language that makes it simple to write fast, secure web applications without sacrificing flexibility, usability, or type safety. It provides a significant amount of functionality out-of-the-box, such as request routing, template rendering, form validation, and more. Rocket's philosophy revolves around usability and intuitiveness; it emphasizes clear and expressive syntax, detailed error messages, and powerful abstractions. Despite these aids, Rocket doesn't shield you from the complexities of web programming, but instead offers tools and interfaces to make these complexities manageable.

@ -1 +1,3 @@
# Warp
Warp is a web server framework for Rust that focuses on composability and safety. It's built on top of `hyper`, a low-level HTTP library, but Warp adds a user-friendly layer on top of that, allowing developers to build custom routing logic with ease. Warp's primary concept is the "Filter", which can be combined and nested to create complex HTTP servers. Despite this abstraction, it manages to maintain a high level of performance thanks to Rust's zero-cost abstractions. Another feature of Warp is its capability to handle websockets, streaming bodies, and multipart forms.

@ -1 +1,3 @@
# Actix
Actix is a powerful, pragmatic, and extremely fast web framework for Rust. It is based on Actix actor's framework, built around a small and simple API focused on making the creation of web applications straightforward and efficient. Its capable middleware system allows for highly customizable processing of web requests, making it versatile for a wide range of web development tasks. With support for WebSockets and server-sent events included, integration of real-time communication is quite seamless in Actix. Despite its high-level abstractions and ease of use, Actix does not compromise on performance, delivering some of the fastest processing times among Rust web frameworks.

@ -1 +1,3 @@
# Yew
"Yew" is a modern Rust framework for creating multi-threaded front-end web apps with WebAssembly. It features a component-based framework similar to React and Elm, and supports JavaScript interoperability, allowing the execution of JS code from Rust and vice versa. Yew is able to tap into Rust's powerful ecosystem, providing high-speed rendering and packing a punch when it comes to building rich, high-performing user experiences on the web.

@ -1 +1,3 @@
# Web development
# Web Development
Web Development in Rust is a growing field, given the programming language's emphasis on safety and performance. In Rust, web development may involve using frameworks like Rocket, Actix or Tide to build web applications. There are also powerful web servers like Hyper that are built in Rust. Building web applications in Rust can involve facilitating client-server communication, handling HTTP requests, building routing systems, and managing databases among the other general tasks associated with web development. The Rust ecosystem provides tools to manage all these tasks and more.

@ -1 +1,3 @@
# Tokio
Tokio, a Rust framework for developing applications, is used primarily for asynchronous programming that enables you to write asynchronous inputs/output, networking, and other features. Its primary function is to deliver high-performance, reliable, and easy-to-use asynchronous event-driven platform. It is built on the futures library and uses the async/await syntax of Rust for readability purposes. Tokio's 'runtime' provides I/O driver functions, scheduling and timers offering a foundation for asynchronous programming. It is designed to handle a high volume of network connections concurrently, making it ideal for building network applications.

@ -1 +1,3 @@
# Async std
# async-std
`async-std` is a Rust library that provides an asynchronous version of the standard library. With the goal of being a drop-in replacement for Rust's standard library, it brings asynchronous programming directly into Rust's native system library, std. The most essential part inside `async-std` is an asynchronous runtime which includes IO and task scheduling. It lets you write asynchronous code that looks like synchronous code without having to worry about using future combinators or remembering to check if futures are ready. This significantly simplifies Rust's asynchronous programming model.

@ -1 +1,3 @@
# Smol
# smol
`smol` is a small, fast, and modern async runtime for Rust programming language. It is built on top of async-std and tokio. With very few lines of code, it allows users to perform tasks such as creating async functions, waiting on a future, creating a timer, among others. Although it is feature-rich, smol keeps its API minimal and clean, making it the go-to choice for many developers working with Rust. It supports async/.await natively and is highly efficient due to its superior scheduling capabilities.

@ -1 +1,3 @@
# Async programming
# Asynchronous Programming
Async programming, short for asynchronous programming, in Rust allows the execution of tasks concurrently instead of sequentially. This means that you don't have to wait for a function to complete all its tasks before another function starts executing. As Rust is a systems programming language and is quite close to the hardware, async programming can provide efficient usage of resources, especially in IO-heavy applications. To facilitate async programming, `async` and `await` were introduced into Rust. `async` annotifies a function is asynchronous and can return `Future`, while `await` is used to pause and resume an `async` function. To manage tasks efficiently, Rust also provides async runtimes such as Tokio and async-std.

@ -1 +1,3 @@
# Reqwest
# reqwest
`Reqwest` is a Rust library which is designed to make HTTP requests easy and effortless. It offers a mix of convenience methods for both synchronous and asynchronous requests,GET,POST and other HTTP methods. It also supports JSON content and is built on `hyper` for HTTP and `tokio` for asynchronous I/O. This means you can take advantage of the powerful asynchronous features of Rust such as Futures and async/await. Furthermore, `Reqwest` takes care of many tedious aspects of HTTP for you, such as handling cookies and encoding/decoding different formats.

@ -1 +1,3 @@
# Hyper
# hyper
"Hyper" is a fast, safe and concurrent HTTP client and server written in Rust. It uses a non-blocking I/O model for efficient execution, leverages the Tokio platform for event-driven, asynchronous I/O, and includes support for HTTP/2. It has a modular design, allowing you to choose the features you need. Hyper also features a server-side framework for building your own HTTP applications. For security and speed, it comes with native support for HTTP/1 and HTTP/2, and automatically negotiates these protocols. Most importantly, it is designed from the ground up to take advantage of Rust's memory safety and concurrency features.

@ -1 +1,3 @@
# Quinn
# quinn
`Quinn` is a Rust networking library providing high-level access to the QUIC protocol. It is built on top of the `tokio` runtime and implements the QUIC transport protocol as specified by the IETF. It provides an async, futures-based API for working with QUIC connections and streams. It is designed to offer high performance with robustness and flexibility, supporting both client and server roles. The QUIC protocol itself is a multiplexed and secure transport protocol positioned as a modern alternative to TCP, offering better performance for many networking applications.

@ -1 +1,3 @@
# Networking
In Rust, the `std::net` module provides functionality for networking. This includes types that represent IP addresses (`Ipv4Addr` and `Ipv6Addr`), a socket address (`SocketAddr`), and TCP/UDP networking types (`TcpStream`, `TcpListener`, `UdpSocket`). There's also the `TcpStream` type for connection-oriented sockets, `TcpListener` for a TCP socket that's listening for incoming connections, and `UdpSocket` for connection-less sockets. Rust’s networking interface is built around BSD sockets with methods that closely follow the system's system calls. The types in this module encompass low-level network primitives, which can be used to build networking applications.

@ -1 +1,3 @@
# Serde
"Serde" is a framework in Rust that enables the serialization and deserialization of data structures. It provides a way to convert your data structures from Rust into a format that can be stored or sent over the network, and vice versa, in a flexible and straightforward manner. Despite its convenience, Serde avoids compromising on speed, and it is super-efficient. The library supports a variety of data formats, like JSON, Bincode, TOML, YAML, and more. Serde's design allows you to customize serialization and deserialization in intricate ways if the default behavior doesn't suit your application's needs.

@ -1 +1,3 @@
# Json rust
# json-rust
`JSON` (JavaScript Object Notation) is a lightweight data-interchange format that is used to store and exchange data. In `Rust`, you can work with `JSON` data using the `serde` and `serde_json` libraries. The `serde` library provides a way for high-performance serialization, and `serde_json` is a `serde` format for handling `JSON` data. The library provides mechanisms for converting between `Rust` data structures and `JSON`. This includes the ability to parse `JSON` data from strings or files, serialize `Rust` data structures to `JSON`, and manipulate `JSON` values directly.

@ -1 +1,3 @@
# Toml rs
# toml-rs
`toml-rs` is a library in Rust designed to parse and serialize TOML documents. TOML, which stands for Tom's Obvious, Minimal Language, is a straightforward and easy-to-read format often used for configuration files. The `toml-rs` library provides functionalities to convert between TOML documents and Rust structures. It heavily uses Rust's powerful trait system and type inference, to parse a TOML document into Rust's static types for further manipulation. Moreover, by making use of the 'serde' library, it enables automatic serialization and deserialization between TOML and Rust types.

@ -1 +1,3 @@
# Serialization
# Serialization/Deserialization
Serialization in Rust refers to the process of converting complex data types into a byte stream for transport over a network, storing in a file, or simply for use in a program. It provides a mechanism to maintain the state of an object by saving and restoring its state. To accomplish this, Rust has two prevalent crates known as `serde` and `bincode`. `Serde` is a robust framework for serializing and deserializing data, and `bincode` is one example of a serializer/deserializer that Serde can use. With Serde, we can develop efficient, compact, and customizable representations of Rust data structures.

@ -1 +1,3 @@
# Diesel
Diesel is a safe, extensible ORM (Object-Relational Mapping) and query builder for Rust. Diesel is designed to help you move between database schema, SQL queries, and your data in your application with safety and ease. It provides a high-level API and avoids the need to manage database connections manually. It simplifies SQL interfacing, ensuring type safety and connection handling right from the box. Diesel supports PostgreSQL, SQLite, and MySQL databases.

@ -1 +1,3 @@
# Sqlx
# sqlx
`SQLx` is an extensible, async, pure-Rust SQL toolkit and ORM that provides a suite of macros and builders for interacting with databases. It enables you to interact directly with your database without having to write SQL-statements, but with the strong typing of Rust. SQLx supports PostgreSQL, MySQL, SQLite, and MSSQL and is compatible with the `tokio` and `async-std` async runtimes. SQLx ensures compile-time checking of your SQL queries, which significantly reduces runtime errors due to malformed SQL.

@ -1 +1,3 @@
# Rusqlite
# rusqlite
`rusqlite` is a simple and ergonomic library for interacting with SQLite databases in Rust. It is designed to be uncomplicated and easy to fit into existing Rust software. With `rusqlite`, you can execute efficient high-level database operations with minimal SQL knowledge or effort. Built around the `sqlite3` C library, it offers a comprehensive API for executing queries and retrieving results. `rusqlite` also integrates seamlessly with the `serde` crate, allowing for easy, type-safe bidirectional mapping between SQL and Rust data structures.

@ -1 +1,3 @@
# Database orm
# Database and ORM
ORM stands for Object-Relational Mapping. It's a programming technique used to convert data between incompatible type systems using object-oriented programming languages. In Rust, the database ORM provides an abstraction for dealing with SQL queries, where you don't need to write raw SQL queries. Instead, you can create, delete and manipulate database records using Rust's interface. It transforms data from a relational database model (tables, rows, and columns) into objects that can be used in code. Important database ORMs in Rust include Diesel, sqlx, and others.

@ -1 +1,3 @@
# Ring
# ring
`Ring` is a popular cryptography library in Rust providing a safe, fast and easy-to-use platform for handling a broad range of cryptographic operations. The library supports a variety of cryptographic primitives, including RSA, AES, SHA, and many others. `Ring` is focused on the implementation of TLS protocol and cryptographic algorithm fundamentals, hence it doesn't include functionalities like parsing or serialization. This library excels in eliminating many common pitfalls of crypto usage by asserting on compile-time and runtime checks. One key feature is its limitation to safe, reviewed cryptographic algorithms, which enables it to help prevent accidental usage of insecure ones.

@ -1 +1,3 @@
# Rust crypto
# rust-crypto
`Rust Crypto` is a set of cryptographic algorithms implemented in the Rust programming language. Users can utilize these algorithms for encryption, decryption, hashing, and digital signature applications, among others. Notable features in Rust Crypto include ciphers like AES and DES, hash functions like SHA and MD5, and digital signatures such as RSA. It is recognized for its speed and low memory usage, thus making it a suitable option for systems with limited resources.

@ -1 +1,3 @@
# Sodiumoxide
# sodiumoxide
"Sodiumoxide" is a Rust binding to the networking and cryptography library, libsodium. It is designed to be easy to use and difficult to misuse. Sodiumoxide follows the design of NaCl for simplicity while allowing the performance benefits of libsodium. It provides cryptographic primitives in a safe, high-level, idiomatic Rust wrapper. It attempts to handle all possible errors, eliminating the possibility of a misuse, a significant advantage over using libsodium directly. Overall, sodiumoxide aims to make high-level cryptographic operations accessible without sacrificing safety or performance.

@ -1 +1,3 @@
# Cryptography
Cryptography is a method of storing and transmitting data in a particular form so that only those for whom it is intended can read and process it. This practice is widely used in securing modern communications and protecting data from theft or tampering. It bases itself on the fundamentals of mathematics to transform data into a format that is unreadable without a key. In its simplest form, it involves just two steps: encryption and decryption. Encryption is the process of converting readable data into an unreadable format using an algorithm and a key. Decryption is the reverse of encryption; it turns the unreadable data back into its original form with the use of the matching key.

@ -1 +1,3 @@
# Clap
# clap
`clap` is a command line argument parser for Rust. It is used for managing and parsing command line arguments and subcommands for your application. `clap` allows you to set the name, version, author, about info, and other global settings of your application. It also supports auto-generated help messages, custom errors, and is unicode compatible. It is very flexible and highly configurable and allows you to extract the needed values easily with the provided methods.

@ -1 +1,3 @@
# Structopt
# structopt
`StructOpt` is a third-party library in Rust designed to parse command-line arguments by defining a struct. It brings together the capabilities of `clap` for command-line parsing with Rust's powerful type system. With `StructOpt`, you can define a struct for your command-line program where each field represents a flag, switch, option, or positional argument. This allows a highly declarative and expressive means of handling command-line inputs, including automatic help message generation, strongly-typed values, default values, validators, and more.

@ -1 +1,3 @@
# Termion
# termion
`Termion` is a pure Rust, bindless library for low-level handling, manipulating and reading information about terminals. This provides a full-featured solution for cross-terminal compatibility, allowing for features such as color support, input handling, and other terminal specific features. It's completely independent and does not require any third-party libraries or bindings in C, C++ or any other language. As such, `Termion` simplifies the process of writing cross-platform CLI applications or utilities in Rust, while maintaining a lean, zero-dependency codebase.

@ -1 +1,3 @@
# Cli utils
# CLI Utilities
"CLI Utils" in Rust refers to command-line interface utilities. These are tools or programs that allow users to interact with their computer's operating system via command lines, as opposed to graphical user interfaces (GUI). A CLI utility operates based on commands given by the user. In Rust, packages like clap and structopt are typically used to build such CLI tools, thanks to their capability to parse command line arguments. They provide methods to define what arguments a program accepts, handle incorrect input, generate help messages, and more - all things that make a CLI utility very useful and efficient. Rust's efficient memory management and speed make it a popular choice to build fast and reliable CLI utilities.

@ -1 +1,3 @@
# Bevy
# bevy
Bevy is a simple, data-driven game engine built in Rust. It emphasizes high performance with its ECS (Entity Component System) architecture and provides the tools needed to build immersive interactive real-time systems. With modern design principles, Bevy enables developers to create rich interactive systems without complex boilerplate. In addition, Bevy provides flexibility with its modular and extensible structure capable of supporting a wide range of different types of games and multimedia applications. It also allows users to build both 2D and 3D games with support for custom shaders and materials.

@ -1 +1,3 @@
# Fyrox
# fyrox
"Fyrox" is a modern, lightweight, highly optimized and fast 3D game engine specifically designed for Rust. Leveraging the safety and concurrency inherent in Rust lang, it offers a high level of performance and reliability in game development. Its lower level of abstraction allows more direct control over the hardware, making it more suitable for performance-critical parts of a game. These aspects combined with a robust feature set, such as support for common 3D formats and advanced lighting and shadowing techniques, make Fyrox an ideal choice for developing games in Rust.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save