Convert Figma logo to code with AI

rust-lang logorustfmt

Format Rust code

5,953
874
5,953
777

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.

33,285

A simple, fast and user-friendly alternative to 'find'

47,483

ripgrep recursively searches directories for a regex pattern while respecting your gitignore

48,640

A cat(1) clone with wings.

23,530

A modern replacement for ‘ls’.

49,046

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:

  1. Install Rustfmt:

    rustup component add rustfmt
    
  2. Format a single file:

    rustfmt path/to/your/file.rs
    
  3. Format an entire project:

    cargo fmt
    
  4. 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.

33,285

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.

47,483

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.

48,640

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
23,530

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.

49,046

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 Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

rustfmt linux mac windows crates.io

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 place
  • rustfmt will read a code from stdin and write formatting to stdout
    • echo "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 with rustfmt --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:

    FlagDescriptionNightly Only
    filesoverwrites output to filesNo
    stdoutwrites output to stdoutNo
    coveragedisplays how much of the input file was processedYes
    checkstyleemits in a checkstyle formatYes
    jsonemits diffs in a json formatYes

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.