prismulti 0.1.1

A multi-threaded Rust implementation of a subset of the PRISM model checker.
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    rust-overlay.url = "github:oxalica/rust-overlay";
    rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
    crane.url = "github:ipetkov/crane";
  };

  outputs =
    {
      self,
      nixpkgs,
      rust-overlay,
      crane,
      ...
    }:
    let
      systems = [
        "x86_64-linux"
        "aarch64-linux"
        "aarch64-darwin"
      ];
      forAllSystems =
        f:
        nixpkgs.lib.genAttrs systems (
          system:
          let
            pkgs = import nixpkgs {
              inherit system;
              overlays = [ rust-overlay.overlays.default ];
            };
            rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
            craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
            laceSrc = pkgs.fetchFromGitHub {
              owner = "trolando";
              repo = "lace";
              rev = "v1.3.1";
              hash = "sha256-zd09+URUh2rxNeNcBid/KCTQ0wgRWWGq7qQ3m1AhcCo=";
            };
            sylvanSrc = pkgs.fetchFromGitHub {
              owner = "trolando";
              repo = "sylvan";
              rev = "v1.7.1";
              hash = "sha256-mca0j++dt/ehLRwikmz5EUaZ6XMA8F3k4RkknR+naM8=";
            };
            sylvanFetchContentToolchain = pkgs.writeText "sylvan-fetchcontent-toolchain.cmake" ''
              set(FETCHCONTENT_SOURCE_DIR_LACE "${laceSrc}" CACHE PATH "")
              set(FETCHCONTENT_SOURCE_DIR_SYLVAN "${sylvanSrc}" CACHE PATH "")
            '';

            src =
              let
                nonStandardFilter =
                  path: type:
                  let
                    baseName = baseNameOf path;
                  in
                  (pkgs.lib.hasInfix "/docs/" path)
                  || (pkgs.lib.hasInfix "/tests/dtmc/" path)
                  || (pkgs.lib.hasSuffix ".md" baseName)
                  || (pkgs.lib.hasSuffix ".prism" baseName)
                  || (pkgs.lib.hasSuffix ".prop" baseName)
                  || (pkgs.lib.hasSuffix ".lalrpop" baseName);
              in
              pkgs.lib.cleanSourceWith {
                src = ./.;
                filter = path: type: (nonStandardFilter path type) || (craneLib.filterCargoSources path type);
              };

            commonArgs = {
              inherit src;
              strictDeps = true;
              nativeBuildInputs = [
                pkgs.cmake
                pkgs.git
                pkgs.pkg-config
              ];
              buildInputs = [ pkgs.gmp ];
              CMAKE_TOOLCHAIN_FILE = sylvanFetchContentToolchain;
            };

            cargoArtifacts = craneLib.buildDepsOnly commonArgs;

          in
          f {
            inherit
              pkgs
              rustToolchain
              craneLib
              commonArgs
              cargoArtifacts
              src
              ;
          }
        );
    in
    {
      packages = forAllSystems (args: {
        default = args.craneLib.buildPackage (args.commonArgs // { inherit (args) cargoArtifacts; });
      });

      checks = forAllSystems (args: {
        prismulti-tests = args.craneLib.cargoTest (
          args.commonArgs
          // {
            inherit (args) cargoArtifacts;
            RUST_TEST_THREADS = "1";
          }
        );
        prismulti-fmt = args.craneLib.cargoFmt { inherit (args) src; };
        prismulti-clippy = args.craneLib.cargoClippy (
          args.commonArgs
          // {
            inherit (args) cargoArtifacts;
            cargoClippyExtraArgs = "--all-targets -- --deny warnings";
          }
        );
      });

      devShells = forAllSystems (args: {
        default = args.pkgs.mkShell {
          packages = [
            args.rustToolchain
            args.pkgs.python3
            args.pkgs.python3Packages.mypy
            args.pkgs.uv
            args.pkgs.graphviz
            args.pkgs.git
            args.pkgs.pkg-config
            args.pkgs.gnuplot
            args.pkgs.cmake
            args.pkgs.gcc15
            args.pkgs.gmp
            args.pkgs.hyperfine
          ]
          ++ args.pkgs.lib.optionals args.pkgs.stdenv.isLinux [
            args.pkgs.perf
          ];
        };
      });
    };
}