{ inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; inputs.d2n.url = "github:nix-community/dream2nix"; inputs.d2n.inputs.nixpkgs.follows = "nixpkgs"; inputs.parts.url = "github:hercules-ci/flake-parts"; inputs.rust-overlay.url = "github:oxalica/rust-overlay"; inputs.rust-overlay.inputs.nixpkgs.follows = "nixpkgs"; outputs = inp: inp.parts.lib.mkFlake {inputs = inp;} { systems = ["x86_64-linux"]; imports = [inp.d2n.flakeModuleBeta]; perSystem = { config, system, pkgs, ... }: let cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml); pkgsWithToolchain = pkgs.appendOverlays [inp.rust-overlay.overlays.default]; toolchains = pkgsWithToolchain.rust-bin.stable."${cargoToml.package.rust-version}"; # toolchain to use when building conduit, includes only cargo and rustc to reduce closure size buildToolchain = toolchains.minimal; # toolchain to use in development shell # the "default" component set of toolchain adds rustfmt, clippy etc. devToolchain = toolchains.default.override { extensions = ["rust-src"]; }; # flake outputs for conduit project conduitOutputs = config.dream2nix.outputs.conduit; in { dream2nix.inputs.conduit = { source = inp.self; projects.conduit = { name = "conduit"; subsystem = "rust"; translator = "cargo-lock"; }; packageOverrides = { "^.*".set-toolchain.overrideRustToolchain = _: { cargo = buildToolchain; rustc = buildToolchain; }; }; }; devShells.conduit = conduitOutputs.devShells.conduit.overrideAttrs (old: { # export default crate sources for rust-analyzer to read RUST_SRC_PATH = "${devToolchain}/lib/rustlib/src/rust/library"; nativeBuildInputs = (old.nativeBuildInputs or []) ++ [devToolchain]; }); devShells.default = config.devShells.conduit; }; }; }