diff --git a/flake.nix b/flake.nix index 86d31f2..4a80620 100644 --- a/flake.nix +++ b/flake.nix @@ -13,23 +13,28 @@ let lib = nixpkgs.lib; systems = ["x86_64-linux"]; - forEachSystem = fn: lib.genAttrs systems (system: let + + forEachSystem = fn: lib.genAttrs systems (system: + let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; - rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; - in fn { inherit pkgs rustToolchain; } ); - in { - packages = forEachSystem ({ pkgs, rustToolchain }: let + in fn { inherit pkgs; } ); + + cargoManifest = lib.importTOML ./Cargo.toml; + packageName = cargoManifest.package.name; + + mkRustToolchain = pkgs: pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; + + mkRustPackage = pkgs: + let + rustToolchain = mkRustToolchain pkgs; rustPlatform = pkgs.makeRustPlatform { cargo = rustToolchain; rustc = rustToolchain; }; - manifest = lib.importTOML ./Cargo.toml; - packageName = manifest.package.name; - packageVersion = manifest.package.version; - - package = rustPlatform.buildRustPackage { + packageVersion = cargoManifest.package.version; + in rustPlatform.buildRustPackage { nativeBuildInputs = [ rustToolchain ]; pname = packageName; @@ -47,12 +52,56 @@ mainProgram = packageName; }; }; + in { + packages = forEachSystem ({ pkgs }: + let + package = mkRustPackage pkgs; in { default = package; ${packageName} = package; }); - devShells = forEachSystem ({ pkgs, rustToolchain }: let + homeManagerModules.default = { config, pkgs, ... }: + let + inherit (lib) mkIf mkOption mkEnableOption types; + selfConfig = config.programs.${packageName}; + package = mkRustPackage pkgs; + in { + options = { + programs.${packageName} = { + enable = mkEnableOption packageName; + package = mkOption { + type = types.package; + default = package; + }; + + enableNushellIntegration = mkOption { + default = config.programs.nushell.enable; + type = types.bool; + description = "Whether to enable Nushell integration"; + }; + }; + }; + + config = mkIf selfConfig.enable { + home.packages = [ selfConfig.package ]; + programs.nushell = let + cacheHome = "${config.xdg.cacheHome}/valeth/${packageName}"; + initFile = "${cacheHome}/init.nu"; + in mkIf selfConfig.enableNushellIntegration { + extraEnv = '' + if not ("${cacheHome}" | path exists) { + mkdir "${cacheHome}" + } + ${selfConfig.package}/bin/${packageName} init nu | save --force ${initFile} + ''; + extraConfig = "source ${initFile}"; + }; + }; + }; + + devShells = forEachSystem ({ pkgs }: let + rustToolchain = mkRustToolchain pkgs; rustNightlyToolchain = pkgs.rust-bin.selectLatestNightlyWith (t: t.minimal.override { extensions = [ "rustfmt" ]; });