kodept 0.2.2

Simple compiler with dependent types support in mind
Documentation
{
  inputs = {
    fenix.url = "github:nix-community/fenix/staging";
    flake-utils.url = "github:numtide/flake-utils";
    naersk.url = "github:nix-community/naersk";
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    devenv.url = "github:cachix/devenv";
  };

  outputs = { self, flake-utils, naersk, nixpkgs, fenix, devenv }@inputs:
    let
      system = flake-utils.lib.system.x86_64-linux;

      pkgs = (import nixpkgs) {
        inherit system;
      };
      
	  rust_pkgs = fenix.packages.${system};
      toolchain = with rust_pkgs; combine [
      	latest.rustc
      	latest.cargo
      	targets.x86_64-unknown-linux-musl.latest.rust-std
      ];

      toolchain_win = with fenix.packages.${system}; combine [
        minimal.rustc
        minimal.cargo
        targets.x86_64-pc-windows-gnu.latest.rust-std
      ];

      naersk' = naersk.lib.${system}.override {
        cargo = toolchain;
        rustc = toolchain;
      };

      naersk_win = naersk.lib.${system}.override {
        cargo = toolchain_win;
        rustc = toolchain_win;
      };

      pegviz_source = pkgs.fetchFromGitHub {
        owner = "fasterthanlime";
        repo = "pegviz";
        rev = "c9fd73363d4bf2eca4e2ebfd31c3c49b8a16b8f5";
        sha256 = "sha256-nkbY0flJ0hEm3jPvW7tdSKwpsX6aW1PIStOQ/TGhmxg=";
      };
    in rec
    {
      packages.${system} = {
        pegviz = naersk'.buildPackage {
          src = pegviz_source;
          doCheck = false;
          doDoc = false;

          RUSTFLAGS = "-C target-feature=+crt-static";
          CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl";
        };

        kodept = naersk'.buildPackage {
          src = self;
          nativeBuildInputs = with pkgs; [ pkgsStatic.stdenv.cc ];
          buildInputs = [ packages.${system}.pegviz ];
          doCheck = true;
          doDoc = false;

          RUSTFLAGS = "-C target-feature=+crt-static";
          CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl";
        };

        default = packages.${system}.kodept;
      };

      packages.${flake-utils.lib.system.x86_64-windows} = {
        pegviz = naersk_win.buildPackage {
          src = pegviz_source;
          doCheck = false;
          doDoc = false;
          strictDeps = true;
          depsBuildBuild = with pkgs; [
            pkgsCross.mingwW64.stdenv.cc
            pkgsCross.mingwW64.windows.pthreads
          ];

          CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu";
        };

        kodept = naersk_win.buildPackage {
          src = self;
          strictDeps = true;
          doCheck = false;
          nativeBuildInputs = with pkgs; [ wineWowPackages.stable ];
          buildInputs = [ packages.${flake-utils.lib.system.x86_64-windows}.pegviz ];
          depsBuildBuild = with pkgs; [
            pkgsCross.mingwW64.stdenv.cc
            pkgsCross.mingwW64.windows.pthreads
          ];

          CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu";
          CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUNNER = pkgs.writeScript "wine-wrapper" ''
            export WINEPREFIX = "$(mktemp -d)"
            exec wine64 $@
          '';
        };

        default = packages.${flake-utils.lib.system.x86_64-windows}.kodept;
      };

      devShells.${system}.default = devenv.lib.mkShell {
        inherit inputs pkgs;
        modules = [
          ({ pkgs, config, ... }: {
             packages = with pkgs; [ 
               xdot 
               rustup
               graphviz
               cargo-insta
               gnuplot
               packages.${system}.pegviz
             ];
             
             pre-commit.hooks.clippy.enable = true;
             languages.rust = {
               enable = true;
               toolchain = rust_pkgs.latest;
             };
           })
        ];
      };
    };
}