nixel 5.1.1

Parser for the Nix Expressions Language
Documentation
# SPDX-FileCopyrightText: 2022 Kevin Amado <kamadorueda@gmail.com>
#
# SPDX-License-Identifier: GPL-3.0-only
{
  inputs = {
    blank.url = "github:divnix/blank";

    fenix.url = "github:nix-community/fenix";
    fenix.inputs.nixpkgs.follows = "nixpkgs";
    fenix.inputs.rust-analyzer-src.follows = "blank";

    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
  };

  outputs = inputs: let
    commit = inputs.self.shortRev or "dirty";
    date = inputs.self.lastModifiedDate or inputs.self.lastModified or "19700101";
    version = "5.1.1+${builtins.substring 0 8 date}.${commit}";

    overlay = self: super: {
      nixel = self.rustPlatform.buildRustPackage {
        pname = "nixel";
        inherit version;
        src = ./.;
        cargoLock.lockFile = ./Cargo.lock;

        nativeBuildInputs = [
          self.pkg-config
          self.pkgsBuildBuild.rustPlatform.bindgenHook
        ];
        buildInputs = [self.gcc.cc.lib];

        # buildType = "debug";
        # doCheck = false;

        meta = {
          description = "Parser for the Nix Expressions Language";
          homepage = "https://github.com/kamadorueda/nixel";
          license = self.lib.licenses.gpl3Only;
          maintainers = [self.lib.maintainers.kamadorueda];
          platforms = self.lib.systems.doubles.all;
        };
      };
    };

    nixpkgsFor = system:
      import inputs.nixpkgs {
        overlays = [overlay];
        inherit system;
      };

    outputsFor = system: let
      fenix = inputs.fenix.packages.${system};
      nixpkgs = nixpkgsFor system;
    in {
      packages.${system}.default = nixpkgs.nixel;

      devShells.${system}.default = nixpkgs.mkShell {
        name = "nixel";
        packages = [
          fenix.stable.toolchain
          nixpkgs.cargo-license
          nixpkgs.cargo-tarpaulin
          nixpkgs.clang
          nixpkgs.linuxPackages_latest.perf
          nixpkgs.reuse
          nixpkgs.valgrind

          # Vendor dependencies
          (nixpkgs.writeShellApplication {
            name = "vendor";

            runtimeInputs = [nixpkgs.bison nixpkgs.flex];

            text = ''
              rm -rf src/vendored
              mkdir src/vendored

              bison src/parser/generator.y

              flex src/lexer/generator.l
            '';
          })

          # License stuff
          (nixpkgs.writeShellApplication {
            name = "license";

            runtimeInputs = [nixpkgs.reuse];

            text = ''
              copyright='Kevin Amado <kamadorueda@gmail.com>'
              license='GPL-3.0-only'

              find . -type f -name '*.license' -exec rm {} +

              reuse addheader \
                --copyright="$copyright" \
                --license="$license" \
                --force-dot-license \
                Cargo.lock \
                flake.lock \
                src/vendored/lexer.* \
                src/vendored/parser.* \

              git ls-files \
                | grep -v src/lexer/generator.l \
                | grep -v tests/cases \
                | grep -v tests/inputs/manual \
                | grep -v tests/inputs/nixpkgs \
                | xargs reuse addheader \
                  --copyright="$copyright" \
                  --license="$license" \
                  --skip-unrecognised

              reuse lint
            '';
          })
        ];
        shellHook = ''
          export LIBCLANG_PATH="${nixpkgs.libclang.lib}/lib"
        '';
      };
    };
  in
    builtins.foldl' inputs.nixpkgs.lib.recursiveUpdate {} [
      (outputsFor "aarch64-darwin")
      (outputsFor "aarch64-linux")
      (outputsFor "x86_64-darwin")
      (outputsFor "x86_64-linux")
      {
        packages."x86_64-linux".static = (nixpkgsFor "x86_64-linux").pkgsStatic.nixel;
      }
    ];
}