code_style_guide.md was the generic C++ formulation of the Modified Allman style: it mandated camelCase for functions (every function in this crate is Rust snake_case, and rustc warns otherwise), three of its five examples taught try/catch brace placement for a construct Rust does not have, all examples were C++, and it instructed saving a .clang-format that does not exist and would not format Rust anyway. Its final YAML block was also missing the closing fence, so renderers swallowed the tail of the document. Since README defers to CONTRIBUTING and CONTRIBUTING defers here for the full rules, the contributor path terminated in the one document that contradicted the code.
Rewrite it for Rust: same principles (tabs, opening brace on its own line, compact "} else {", spaces inside non-empty parentheses), plus the rules the code follows but no document stated — snake_case for functions and variables, spaces inside non-empty attribute brackets, no spaces inside generics, aligned columns, comments in English. Examples are now idiomatic Rust: if/else, match, Result with the ? operator in place of try/catch, if let, struct + impl with attributes. The file declares itself the canonical reference, with CONTRIBUTING's bullets as the summary.
Replace the .clang-format section with the verified rustfmt situation: rustfmt cannot express this style (no option exists for spaces inside parentheses or attribute brackets, the brace-style options are nightly-only, and even on nightly Allman opening braces cannot combine with a compact "} else {"). Ship a rustfmt.toml with disable_all_formatting = true — a stable option, verified a no-op on rustfmt 1.8.0 — so an accidental cargo fmt or editor format-on-save can no longer rewrite the tree.
3.6 KiB
Executable File
Code Style Guide
This project follows a Modified Allman brace and formatting style, applied to Rust. It prioritizes visual clarity, symmetry, and logical separation of blocks over strict line compactness.
This file is the canonical style reference; the style bullets in CONTRIBUTING.md are a summary of it.
Key principles
- Indentation with tabs (width = 4).
- Opening braces
{start on their own line — forfn,impl,struct,enum,trait,mod,if,for,while,loopandmatch. } else {and} else if … {stay on the same line for compact flow.- Spaces inside parentheses only when non-empty:
( arg1, arg2 )main()
- Spaces inside attribute brackets only when non-empty:
#[ derive( Clone, Debug ) ],#[ cfg( test ) ]. - No spaces inside generics:
Vec<String>,Option<i32>,Element<Msg>. - Types, traits, and enum variants: PascalCase.
- Functions, methods, variables, and modules: snake_case (the Rust convention;
rustcwarns on anything else). - Constants and statics: UPPER_CASE_WITH_UNDERSCORES.
- Aligned columns in consecutive struct fields, match arms, or
letgroups where it aids scanning. - Comments in English, only where the code cannot say it itself.
Examples
if / else structure
if condition
{
do_something();
} else if other_condition {
do_other_thing();
} else {
do_something_else( arg1, arg2 );
}
match structure
match points.len()
{
0 => None,
1 => Some( points[0].value ),
n => Some( total / n as f32 ),
}
Error handling
Rust has no try / catch; recoverable errors travel as Result and propagate with ?. The block style applies to the match when a result is handled in place:
fn load_config( path: &Path ) -> Result<Config, ConfigError>
{
let text = std::fs::read_to_string( path )?;
match toml::from_str( &text )
{
Ok( cfg ) => Ok( cfg ),
Err( e ) => Err( ConfigError::Parse( e ) ),
}
}
if let follows the same brace rules as if:
if let Some( ( rgba, w, h ) ) = icon( "general/right" )
{
it = it.trailing_icon( rgba, w, h );
}
Structs, impls, and attributes
#[ derive( Clone, Debug ) ]
pub struct DataPoint
{
value: f32,
label: String,
}
impl DataPoint
{
pub fn new( value: f32, label: impl Into<String> ) -> Self
{
Self
{
value,
label: label.into(),
}
}
pub fn scaled( &self, factor: f32 ) -> f32
{
if factor <= 0.0
{
self.value
} else {
self.value * factor
}
}
}
main() function
fn main()
{
let analyzer = DataAnalyzer::new( "results.csv" );
if let Err( e ) = analyzer.process_and_report()
{
eprintln!( "Error: {e}" );
std::process::exit( 1 );
}
}
Tooling: do not run cargo fmt
rustfmt cannot express this style, so never run cargo fmt on this codebase — it would rewrite every file into the default style. Specifically:
- There is no rustfmt option for spaces inside parentheses or attribute brackets (the historical
spaces_within_parensoptions were removed from rustfmt). - The item brace styles (
brace_style,control_brace_style) are unstable, nightly-only options. - Even on nightly, the combination of Allman opening braces with a compact
} else {is not representable:control_brace_style = "AlwaysNextLine"also pusheselseonto its own line.
The repository ships a rustfmt.toml containing only disable_all_formatting = true, so an accidental cargo fmt — or an editor with format-on-save wired to rustfmt — is a no-op instead of a 40 000-line diff. Style is enforced by review, not by a formatter.