20 releases (10 breaking)

0.11.0 Nov 11, 2022
0.10.2 Jun 14, 2022
0.10.1 Dec 6, 2021
0.10.0 Nov 30, 2021
0.5.0 Nov 21, 2018

#250 in Parser implementations

Download history 1852/week @ 2024-02-14 1606/week @ 2024-02-21 2127/week @ 2024-02-28 1824/week @ 2024-03-06 1605/week @ 2024-03-13 1980/week @ 2024-03-20 2060/week @ 2024-03-27 1730/week @ 2024-04-03 1797/week @ 2024-04-10 1673/week @ 2024-04-17 1442/week @ 2024-04-24 1823/week @ 2024-05-01 1894/week @ 2024-05-08 1975/week @ 2024-05-15 2033/week @ 2024-05-22 2137/week @ 2024-05-29

8,394 downloads per month
Used in 20 crates (11 directly)

MIT license

210KB
2.5K SLoC

rnix-parser Crates.io Chat on Matrix

rnix is a parser for the Nix language written in Rust.

This can be used to manipulate the Nix AST and can for example be used for:

  • Interactively render Nix on a GUI
  • Formatting Nix code
  • Rename identifiers

and a lot more!

rnix nowadays uses @matklad's rowan crate to ensure:

  • all span information is preserved, meaning you can use the AST to for example apply highlighting
  • printing out the AST prints out 100% the original code. This is not an over-exaggeration, even completely invalid nix code such as this README can be intact after a parsing session (though the AST will mark errnous nodes)
  • easy ways to walk the tree without resorting to recursion

Demo

Examples can be found in the examples/ directory.

You may also want to see nix-explorer: An example that highlights AST nodes in Nix code. This demonstrates how whitespaces and commands are preserved.

Hacking

Tests can be run with cargo test.

In order to update all .expect-files to the currently expected results, you may run UPDATE_TESTS=1 cargo test.

You can parse Nix expressions from standard input using the from-stdin example. To try that, run the following in your shell:

echo "[hello nix]" | cargo run --quiet --example from-stdin

Release Checklist

  • Ensure that all PRs that were scheduled for the release are merged (or optionally move them to another milestone).

  • Close the milestone for the release (if any).

  • Run cargo test on master (or the branch to release from) with all changes being pulled in.

  • Apply the following patch to nixpkgs-fmt:

    diff --git a/Cargo.toml b/Cargo.toml
    index 0891350..edad471 100644
    --- a/Cargo.toml
    +++ b/Cargo.toml
    @@ -13,6 +13,9 @@ repository = "https://github.com/nix-community/nixpkgs-fmt"
     [workspace]
     members = [ "./wasm" ]
     
    +[patch.crates-io]
    +rnix = { path = "/home/ma27/Projects/rnix-parser" }
    +
     [dependencies]
     rnix = "0.9.0"
     smol_str = "0.1.17"
    

    and run cargo test.

    While it's planned to add fuzzing to rnix-parser as well, nixpkgs-fmt has a decent test-suite that would've helped to catch regressions in the past.

    Note: API changes are OK (and fixes should be contributed to nixpkgs-fmt), behavioral changes are not unless explicitly discussed before.

  • Update the CHANGELOG.md.

  • Bump the version number in Cargo.toml & re-run cargo build to refresh the lockfile.

  • Commit & run nix build.

  • Tag the release and push everything.

  • As soon as the CI has completed, run cargo publish.

RIP jd91mzm2

Sadly, the original author of this project, @jD91mZM2 has passed away. His online presence was anonymous and what we have left is his code. This is but one of his many repos that he contributed to.

Dependencies

~1MB
~13K SLoC