#rustfmt #source #arguments #clippy #rules #format #kind

app rustfmt_if_chain

具有if_chain意识的rustfmt(类似)

8个版本

0.1.7 2023年3月23日
0.1.6 2023年2月27日
0.1.4 2022年10月11日
0.1.3 2022年8月21日
0.1.0 2021年12月31日

#79过程宏

Download history 8/week @ 2024-07-07 55/week @ 2024-07-28

63 每月下载量

MIT/Apache

27KB
631 代码行

rustfmt_if_chain

rustfmt的封装,用于格式化if_chain调用内部

rustfmt_if_chain不一定能在所有Rust源文件上正常工作,但它应该能在大多数Clippy源文件上工作。

cargo install rustfmt_if_chain
Usage: rustfmt_if_chain [ARGS]

Arguments ending with `.rs` are considered source files and are
formatted. All other arguments are forwarded to `rustfmt`, with
one exception.

The one argument not forwarded to `rustfmt` is
`--preformat-failure-is-warning`. If this option is passed and
`rustfmt` fails on an unmodified source file, a warning results
instead of an error.

示例

  • 之前

    fn main() -> PhilosophicalResult<()> {
        if_chain! { if let Some (it) = tree . falls_in (forest) ; if ! listeners . any (| one | one . around_to_hear (it)) ; if ! it . makes_a_sound () ; then { return Err (PhilosophicalError :: new ()) ; } }
        Ok(())
    }
    
  • 之后

    fn main() -> PhilosophicalResult<()> {
        if_chain! {
            if let Some(it) = tree.falls_in(forest);
            if !listeners.any(|one| one.around_to_hear(it));
            if !it.makes_a_sound();
            then {
                return Err(PhilosophicalError::new());
            }
        }
        Ok(())
    }
    

工作原理

  1. 预格式化检查:在原始源文件上运行rustfmt以验证它可以被格式化。
  2. 根据以下规则重写原始源文件中的if_chain调用,其中x是一个在文件中其他地方未出现的标识符
    • if_chain! -> fn x()|x|(取决于调用是项目还是表达式)
    • if ... ; -> if ... { x; }
    • then -> if x
  3. 在步骤1生成的文件上运行rustfmt
  4. 在步骤2生成的文件中,步骤1的重写被撤销。

* 步骤0并非绝对必要,但它有助于识别由步骤1的限制引起的步骤2的失败。

已知问题

  • rustfmt_if_chain --check FILENAME 无法正常工作。一种解决方案是使用 rustfmt_if_chain FILENAME && git diff --exit-code
  • if_chain 的嵌套使用处理不正确:只有最外层的使用会被格式化。

依赖关系

~4–14MB
~179K SLoC