Top Related Projects
⚙️ A curated list of static analysis (SAST) tools and linters for all programming languages, config files, build tools, and more. The focus is on tools which improve code quality.
A simple, fast and user-friendly alternative to 'find'
ripgrep recursively searches directories for a regex pattern while respecting your gitignore
A cat(1) clone with wings.
A modern replacement for ‘ls’.
Prettier is an opinionated code formatter.
Quick Overview
Rustfmt is an official code formatting tool for the Rust programming language. It automatically formats Rust code according to a standardized style, ensuring consistency across projects and making code more readable and maintainable.
Pros
- Enforces a consistent coding style across Rust projects
- Integrates well with popular IDEs and text editors
- Customizable through configuration files
- Helps reduce code review discussions about formatting
Cons
- May sometimes produce unexpected or undesired formatting
- Can be slow on very large codebases
- Limited flexibility in some formatting decisions
- Occasional breaking changes in formatting rules between versions
Getting Started
To use Rustfmt, follow these steps:
-
Install Rustfmt:
rustup component add rustfmt
-
Format a single file:
rustfmt path/to/your/file.rs
-
Format an entire project:
cargo fmt
-
To customize formatting, create a
rustfmt.toml
file in your project root with your preferred settings:max_width = 100 tab_spaces = 4
For more advanced usage and configuration options, refer to the Rustfmt documentation.
Competitor Comparisons
⚙️ A curated list of static analysis (SAST) tools and linters for all programming languages, config files, build tools, and more. The focus is on tools which improve code quality.
Pros of static-analysis
- Comprehensive collection of static analysis tools for multiple programming languages
- Regularly updated with community contributions
- Provides a curated list with descriptions and links to various tools
Cons of static-analysis
- Not a tool itself, but a list of tools
- Requires users to choose and set up individual tools
- May include outdated or less maintained tools alongside popular ones
Code comparison
Not applicable, as static-analysis is a curated list rather than a code repository. Rustfmt, on the other hand, is an actual tool with source code. Here's a sample of Rustfmt's code:
pub fn format_input(
input: Input,
config: Config,
mut file: Option<&mut File>,
) -> Result<(Summary, FormatReport), ErrorKind> {
// ... (implementation details)
}
Summary
static-analysis serves as a valuable resource for developers seeking static analysis tools across various languages. It offers a wide range of options but requires users to evaluate and implement tools individually. Rustfmt, in contrast, is a specific tool focused on formatting Rust code, providing a more targeted solution for Rust developers. While static-analysis offers breadth, Rustfmt offers depth in its specific domain.
A simple, fast and user-friendly alternative to 'find'
Pros of fd
- Faster and more user-friendly alternative to the traditional
find
command - Colorized output and smart case sensitivity by default
- Supports regular expressions and parallel command execution
Cons of fd
- More focused on file searching, less versatile than rustfmt's code formatting capabilities
- May require additional learning for users familiar with traditional
find
command - Not integrated into the Rust ecosystem as deeply as rustfmt
Code Comparison
fd example:
fd -e txt
rustfmt example:
rustfmt --check src/**/*.rs
Summary
fd is a modern, fast file-finding tool written in Rust, offering improvements over traditional find
commands. It excels in searching for files and directories with an intuitive syntax and colorized output.
rustfmt, on the other hand, is a tool specifically designed for formatting Rust code. It ensures consistent code style across Rust projects and is deeply integrated into the Rust ecosystem.
While both tools are written in Rust and demonstrate the language's capabilities, they serve different purposes. fd focuses on file system operations, while rustfmt is essential for maintaining code quality in Rust projects.
ripgrep recursively searches directories for a regex pattern while respecting your gitignore
Pros of ripgrep
- Faster performance for searching large codebases
- Supports searching compressed files and archives
- More advanced search features like regex and glob patterns
Cons of ripgrep
- Less focused on code formatting and style
- Not integrated into the Rust ecosystem as tightly as rustfmt
Code Comparison
ripgrep example:
use grep_regex::RegexMatcher;
use grep_searcher::Searcher;
let matcher = RegexMatcher::new(r"fn\s+main").unwrap();
let mut searcher = Searcher::new();
searcher.search_path(&matcher, "src/main.rs", |_| Ok(true)).unwrap();
rustfmt example:
use rustfmt_nightly as rustfmt;
use syntax::parse::ParseSess;
let mut config = rustfmt::Config::default();
config.set().emit_mode(rustfmt::EmitMode::Stdout);
let input = rustfmt::Input::File("src/main.rs".into());
rustfmt::run(input, &config, Some(&ParseSess::new())).unwrap();
While ripgrep focuses on efficient searching across multiple files and formats, rustfmt is specifically designed for formatting Rust code according to style guidelines. ripgrep offers more versatility for general-purpose searching, while rustfmt is an essential tool for maintaining consistent code style in Rust projects.
A cat(1) clone with wings.
Pros of bat
- Offers syntax highlighting for a wide range of programming languages
- Provides Git integration, showing file modifications in the output
- Includes features like line numbering and automatic paging
Cons of bat
- Larger scope and more complex functionality, potentially harder to maintain
- May have a steeper learning curve for users due to additional features
Code comparison
bat:
let mut printer = InteractivePrinter::new(config);
printer.print_file(input_file)?;
rustfmt:
let mut config = Config::default();
config.set().emit_mode(EmitMode::Stdout);
let mut session = Session::new(config, None);
Key differences
- bat is a feature-rich cat replacement with syntax highlighting and Git integration
- rustfmt is specifically designed for formatting Rust code
- bat has a broader use case, while rustfmt is tailored for Rust developers
- rustfmt focuses on code style consistency, while bat enhances file viewing experience
Use cases
- Use bat for improved file viewing and quick code inspections across various languages
- Use rustfmt for maintaining consistent code style in Rust projects and enforcing formatting standards
Community and development
- Both projects are open-source and actively maintained
- bat has a larger user base due to its general-purpose nature
- rustfmt is an official Rust project, ensuring long-term support and integration with the Rust ecosystem
A modern replacement for ‘ls’.
Pros of exa
- Provides a modern, feature-rich alternative to the traditional
ls
command - Offers colorful and informative output with icons and Git integration
- Supports various viewing options like tree view and grid layout
Cons of exa
- More focused on file listing functionality, less versatile than rustfmt
- May require additional system resources compared to simpler tools
- Learning curve for users accustomed to traditional
ls
command
Code comparison
exa (main functionality):
pub fn print_dir(dir: &Dir, options: &Options) -> io::Result<()> {
let mut files = dir.files();
sort_files(&mut files, options);
for file in files {
print_file(&file, options);
}
Ok(())
}
rustfmt (main functionality):
pub fn format_input(
input: Input,
config: Config,
mut out: &mut dyn Write,
) -> Result<FormatReport, ErrorKind> {
let mut session = Session::new(config, Some(&mut out));
session.format(input)
}
Summary
exa is a modern replacement for the ls
command, focusing on enhanced file listing capabilities with visual improvements. rustfmt, on the other hand, is a code formatting tool for Rust, offering broader functionality for source code manipulation. While exa excels in providing rich file information, rustfmt is more versatile for code-related tasks. The choice between them depends on the specific use case: file exploration vs. code formatting.
Prettier is an opinionated code formatter.
Pros of Prettier
- Supports multiple languages (JavaScript, TypeScript, CSS, HTML, JSON, etc.)
- Highly configurable with many options for customization
- Large and active community with frequent updates and improvements
Cons of Prettier
- Can be opinionated, sometimes forcing a specific style that may not align with team preferences
- May have performance issues with very large files or projects
- Learning curve for advanced configuration and integration with various tools
Code Comparison
Prettier (JavaScript):
function example(longArgument1,
longArgument2,
longArgument3) {
// Prettier will format this function
}
Rustfmt (Rust):
fn example(
long_argument1: Type1,
long_argument2: Type2,
long_argument3: Type3,
) {
// Rustfmt will format this function
}
Additional Notes
- Prettier is a more general-purpose formatter, while Rustfmt is specifically designed for Rust code
- Rustfmt is integrated into the Rust ecosystem and follows Rust-specific conventions
- Prettier has a wider adoption across various web development projects
- Both tools aim to improve code consistency and readability, but with different language focuses
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
rustfmt
A tool for formatting Rust code according to style guidelines.
If you'd like to help out (and you should, it's a fun project!), see Contributing.md and our Code of Conduct.
You can use rustfmt in Travis CI builds. We provide a minimal Travis CI configuration (see here).
Quick start
You can run rustfmt
with Rust 1.24 and above.
On the Stable toolchain
To install:
rustup component add rustfmt
To run on a cargo project in the current working directory:
cargo fmt
On the Nightly toolchain
For the latest and greatest rustfmt
, nightly is required.
To install:
rustup component add rustfmt --toolchain nightly
To run on a cargo project in the current working directory:
cargo +nightly fmt
Limitations
Rustfmt tries to work on as much Rust code as possible. Sometimes, the code doesn't even need to compile! In general, we are looking to limit areas of instability; in particular, post-1.0, the formatting of most code should not change as Rustfmt improves. However, there are some things that Rustfmt can't do or can't do well (and thus where formatting might change significantly, even post-1.0). We would like to reduce the list of limitations over time.
The following list enumerates areas where Rustfmt does not work or where the stability guarantees do not apply (we don't make a distinction between the two because in the future Rustfmt might work on code where it currently does not):
- a program where any part of the program does not parse (parsing is an early stage of compilation and in Rust includes macro expansion).
- Macro declarations and uses (current status: some macro declarations and uses are formatted).
- Comments, including any AST node with a comment 'inside' (Rustfmt does not currently attempt to format comments, it does format code with comments inside, but that formatting may change in the future).
- Rust code in code blocks in comments.
- Any fragment of a program (i.e., stability guarantees only apply to whole programs, even where fragments of a program can be formatted today).
- Code containing non-ascii unicode characters (we believe Rustfmt mostly works here, but do not have the test coverage or experience to be 100% sure).
- Bugs in Rustfmt (like any software, Rustfmt has bugs, we do not consider bug fixes to break our stability guarantees).
Running
You can run Rustfmt by just typing rustfmt filename
if you used cargo install
. This runs rustfmt on the given file, if the file includes out of line
modules, then we reformat those too. So to run on a whole module or crate, you
just need to run on the root file (usually mod.rs or lib.rs). Rustfmt can also
read data from stdin. Alternatively, you can use cargo fmt
to format all
binary and library targets of your crate.
You can run rustfmt --help
for information about available arguments.
The easiest way to run rustfmt against a project is with cargo fmt
. cargo fmt
works on both
single-crate projects and cargo workspaces.
Please see cargo fmt --help
for usage information.
You can specify the path to your own rustfmt
binary for cargo to use by setting theRUSTFMT
environment variable. This was added in v1.4.22, so you must have this version or newer to leverage this feature (cargo fmt --version
)
Running rustfmt
directly
To format individual files or arbitrary codes from stdin, the rustfmt
binary should be used. Some
examples follow:
rustfmt lib.rs main.rs
will format "lib.rs" and "main.rs" in placerustfmt
will read a code from stdin and write formatting to stdoutecho "fn main() {}" | rustfmt
would emit "fn main() {}".
For more information, including arguments and emit options, see rustfmt --help
.
Verifying code is formatted
When running with --check
, Rustfmt will exit with 0
if Rustfmt would not
make any formatting changes to the input, and 1
if Rustfmt would make changes.
In other modes, Rustfmt will exit with 1
if there was some error during
formatting (for example a parsing or internal error) and 0
if formatting
completed without error (whether or not changes were made).
Running Rustfmt from your editor
Checking style on a CI server
To keep your code base consistently formatted, it can be helpful to fail the CI build
when a pull request contains unformatted code. Using --check
instructs
rustfmt to exit with an error code if the input is not formatted correctly.
It will also print any found differences. (Older versions of Rustfmt don't
support --check
, use --write-mode diff
).
A minimal Travis setup could look like this (requires Rust 1.31.0 or greater):
language: rust
before_script:
- rustup component add rustfmt
script:
- cargo build
- cargo test
- cargo fmt --all -- --check
See this blog post for more info.
How to build and test
cargo build
to build.
cargo test
to run all tests.
To run rustfmt after this, use cargo run --bin rustfmt -- filename
. See the
notes above on running rustfmt.
Configuring Rustfmt
Rustfmt is designed to be very configurable. You can create a TOML file called
rustfmt.toml
or .rustfmt.toml
, place it in the project or any other parent
directory and it will apply the options in that file. See rustfmt --help=config
for the options which are available, or if you prefer to see
visual style previews, GitHub page.
By default, Rustfmt uses a style which conforms to the Rust style guide that has been formalized through the style RFC process.
Configuration options are either stable or unstable. Stable options can always be used, while unstable ones are only available on a nightly toolchain, and opt-in. See GitHub page for details.
Rust's Editions
Rustfmt is able to pick up the edition used by reading the Cargo.toml
file if
executed through the Cargo's formatting tool cargo fmt
. Otherwise, the edition
needs to be specified in rustfmt.toml
, e.g., with edition = "2018"
.
Tips
-
For things you do not want rustfmt to mangle, use
#[rustfmt::skip]
-
To prevent rustfmt from formatting a macro or an attribute, use
#[rustfmt::skip::macros(target_macro_name)]
or#[rustfmt::skip::attributes(target_attribute_name)]
Example:
#![rustfmt::skip::attributes(custom_attribute)] #[custom_attribute(formatting , here , should , be , Skipped)] #[rustfmt::skip::macros(html)] fn main() { let macro_result1 = html! { <div> Hello</div> }.to_string();
-
When you run rustfmt, place a file named
rustfmt.toml
or.rustfmt.toml
in target file directory or its parents to override the default settings of rustfmt. You can generate a file containing the default configuration withrustfmt --print-config default rustfmt.toml
and customize as needed. -
After successful compilation, a
rustfmt
executable can be found in the target directory. -
If you're having issues compiling Rustfmt (or compile errors when trying to install), make sure you have the most recent version of Rust installed.
-
You can change the way rustfmt emits the changes with the --emit flag:
Example:
cargo fmt -- --emit files
Options:
Flag Description Nightly Only files overwrites output to files No stdout writes output to stdout No coverage displays how much of the input file was processed Yes checkstyle emits in a checkstyle format Yes json emits diffs in a json format Yes
License
Rustfmt is distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE and LICENSE-MIT for details.
Top Related Projects
⚙️ A curated list of static analysis (SAST) tools and linters for all programming languages, config files, build tools, and more. The focus is on tools which improve code quality.
A simple, fast and user-friendly alternative to 'find'
ripgrep recursively searches directories for a regex pattern while respecting your gitignore
A cat(1) clone with wings.
A modern replacement for ‘ls’.
Prettier is an opinionated code formatter.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot