| name | rust-conventions |
| description | Rust 2021 edition coding conventions. Use when writing or reviewing Rust code. |
Rust Conventions
Key decisions and patterns for Rust 2021.
Naming
| Type | Convention | Example |
|---|
| Structs/Enums/Traits | PascalCase | UserService, Result |
| Functions/Variables | snake_case | get_users, user_count |
| Constants | SCREAMING_SNAKE_CASE | MAX_RETRIES |
| Modules | snake_case | user_service |
Key Decisions
pub fn first(&self) -> &First { &self.first }
pub fn first_mut(&mut self) -> &mut First { &mut self.first }
fn get(&self, key: K) -> Option<&V>;
Error Handling
#[derive(Error, Debug)]
pub enum DataStoreError {
#[error("data store disconnected")]
Disconnect(#[from] io::Error),
}
fn read_config(path: &Path) -> Result<Config> {
let contents = fs::read_to_string(path)
.context("failed to read config")?;
Ok(parse(&contents)?)
}
Common Pitfalls
let mut v = vec![1, 2, 3];
let first = &v[0];
v.push(4);
let mut v = vec![1, 2, 3];
let first = v[0];
v.push(4);
fn longest(x: &str, y: &str) -> &str
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
Tools
- Format:
cargo fmt
- Lint:
cargo clippy -- -D warnings
- Test:
cargo test
Testing Pattern
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_valid() {
let result = parse("test").unwrap();
assert_eq!(result.value, 42);
}
#[test]
fn test_parse_file() -> Result<()> {
let content = fs::read_to_string("test.txt")?;
assert!(parse(&content).is_ok());
Ok(())
}
}