rnix 0.13.0

A Nix parser written in Rust
Documentation
{
  description = "Rust-based parser for nix files";

  inputs = {
    utils.url = "github:numtide/flake-utils";
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    import-cargo.url = "github:edolstra/import-cargo";
    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, utils, import-cargo, fenix }:
    {
      overlay = final: prev: let
        target = final.stdenv.hostPlatform.rust.rustcTarget;
        flags = "--release --offline --target ${target}";
        inherit (import-cargo.builders) importCargo;
      in {
        rnix-parser = final.stdenv.mkDerivation {
          pname = "rnix-parser";
          version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version;
          src = final.lib.cleanSource ./.;
          nativeBuildInputs = with final; [
            rustc cargo
            (importCargo { lockFile = ./Cargo.lock; inherit (final) pkgs; }).cargoHome
          ];

          outputs = [ "out" "doc" ];
          doCheck = true;

          buildPhase = ''
            cargo build ${flags}
            cargo doc ${flags}
          '';

          checkPhase = ''
            cargo test ${flags}
            cargo bench
          '';

          installPhase = ''
            mkdir -p $out/lib
            mkdir -p $doc/share/doc/rnix

            cp -r ./target/${target}/doc $doc/share/doc/rnix
            cp ./target/${target}/release/librnix.rlib $out/lib/
          '';
        };
      };
    }
    // utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs { inherit system; overlays = [ self.overlay ]; };
        fenixPkgs = fenix.packages.${system};
        nightlyToolchain = fenixPkgs.combine [
          fenixPkgs.minimal.cargo
          fenixPkgs.minimal.rustc
        ];
      in
      rec {
        # `nix develop`
        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [ rustfmt rustc cargo clippy ];
        };

        # `nix develop .#fuzz` - for running cargo-fuzz
        devShells.fuzz = pkgs.mkShell {
          buildInputs = [
            nightlyToolchain
            pkgs.cargo-fuzz
          ];
          # libFuzzer needs libstdc++
          LD_LIBRARY_PATH = "${pkgs.stdenv.cc.cc.lib}/lib";
        };

        # Backwards compat
        devShell = devShells.default;

        packages.rnix-parser = pkgs.rnix-parser;
        defaultPackage = packages.rnix-parser;
      }
    );
}