rnix-parser
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:
@@ -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.