#pretty-print #formatter #leptos #directory #format #view #leptosfmt

leptosfmt-pretty-printer

leptosfmt's pretty printer based on the prettyplease crate

7 releases

0.1.8 Dec 22, 2023
0.1.7 Oct 8, 2023
0.1.6 Jun 8, 2023
0.1.5 May 29, 2023
0.1.4 Mar 27, 2023

#100 in Value formatting

Download history 298/week @ 2024-01-02 202/week @ 2024-01-09 223/week @ 2024-01-16 181/week @ 2024-01-23 213/week @ 2024-01-30 218/week @ 2024-02-06 180/week @ 2024-02-13 247/week @ 2024-02-20 226/week @ 2024-02-27 162/week @ 2024-03-05 189/week @ 2024-03-12 197/week @ 2024-03-19 188/week @ 2024-03-26 205/week @ 2024-04-02 141/week @ 2024-04-09 127/week @ 2024-04-16

694 downloads per month
Used in 4 crates (3 directly)

MIT/Apache

18KB
492 lines

leptosfmt

crates.io build security discord

A formatter for the leptos view! macro

All notable changes are documented in: CHANGELOG.md

Install

cargo install leptosfmt

or for trying out unreleased features:

cargo install --git https://github.com/bram209/leptosfmt.git

Usage

Usage: leptosfmt [OPTIONS] [INPUT_PATTERNS]...

Arguments:
  [INPUT_PATTERNS]...  A space separated list of file, directory or glob

Options:
  -m, --max-width <MAX_WIDTH>      Maximum width of each line
  -t, --tab-spaces <TAB_SPACES>    Number of spaces per tab
  -c, --config-file <CONFIG_FILE>  Configuration file
  -s, --stdin                      Format stdin and write to stdout
  -r, --rustfmt                    Format with rustfmt after formatting with leptosfmt (requires stdin)
      --override-macro-names 
        <OVERRIDE_MACRO_NAMES>...  Override formatted macro names
  -q, --quiet                      
      --check                      Check if the file is correctly formatted. Exit with code 1 if not
  -h, --help                       Print help
  -V, --version                    Print version

Using with Rust Analyzer

You can set the rust-analyzer.rustfmt.overrideCommand setting.

  "rust-analyzer.rustfmt.overrideCommand": ["leptosfmt", "--stdin", "--rustfmt"]

And you must configure rustfmt to use the correct edition, place a rustfmt.toml file in the root of your project:

edition = "2021"
# (optional) other config...

Note: For VSCode users, I recommend to use workpsace settings (CMD + shift + p -> Open workspace settings), so that you can only configure leptosfmt for workpsaces that are using leptos. For Neovim users, I recommend using neoconf.nvim for managing project-local LSP configuration.

Configuration

You can configure all settings through a leptosfmt.toml file.

max_width = 100 # Maximum width of each line
tab_spaces = 4 # Number of spaces per tab
indentation_style = "Auto" # "Tabs", "Spaces" or "Auto"
newline_style = "Auto" # "Unix", "Windows" or "Auto"
attr_value_brace_style = "WhenRequired" # "Always", "AlwaysUnlessLit", "WhenRequired" or "Preserve"
macro_names = [ "leptos::view, view" ] # Macro names which will be formatted

To see what each setting does, the see configuration docs

Examples

Single file

Format a specific file by name

leptosfmt ./examples/counter/src/lib.rs

Current directory

Format all .rs files within the current directory

leptosfmt .

Directory

Format all .rs files within the examples directory

leptosfmt ./examples

Glob

Format all .rs files ending with _test.rs within the examples directory

leptosfmt ./examples/**/*_test.rs

A note on non-doc comments

Currently this formatter does not support non-doc comments in code blocks. It uses a fork of prettyplease for formatting rust code, and prettyplease does not support this. I would like to not diverge this fork too much (so I can easily keep in sync with upstream), therefore I didn't add non-doc comment support in my prettyplease fork for now. This means that you can use non-doc comments throughout your view macro, as long as they don't reside within code blocks.

Pretty-printer algorithm

The pretty-printer is based on Philip Karlton’s Mesa pretty-printer, as described in the appendix to Derek C. Oppen, “Pretty Printing” (1979), Stanford Computer Science Department STAN-CS-79-770, http://i.stanford.edu/pub/cstr/reports/cs/tr/79/770/CS-TR-79-770.pdf. This algorithm's implementation is taken from prettyplease which is adapted from rustc_ast_pretty.

The algorithm takes from an input stream of length n and an output device with margin width m, the algorithm requires time O(n) and space O(m). The algorithm is described in terms of two parallel processes; the first scans the input stream to determine the space required to print logical blocks of tokens; the second uses this information to decide where to break lines of text; the two processes communicate by means of a buffer of size o(m). The algorithm does not wait for the entire stream to be input, but begins printing as soon as it has received a linefull of input.

No runtime deps