{ description = "vnj"; inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; naersk = { url = "github:nix-community/naersk"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, naersk, nixpkgs, flake-utils, rust-overlay, }: flake-utils.lib.eachDefaultSystem (system: let overlays = [(import rust-overlay)]; pkgs = import nixpkgs { inherit system overlays; }; rust = pkgs.rust-bin.stable.latest.default; naersk' = pkgs.callPackages naersk {}; vnj = naersk'.buildPackage { src = ./.; }; nixosModule = { pkgs, config, lib, ... }: let ts = lib.types; cfg = config.services.vnj; in { options.services.vnj = { enable = lib.mkEnableOption "vnj"; user = lib.mkOption { type = ts.str; }; instances = lib.mkOption { description = "instances of the vnj"; type = ts.attrsOf ts.attrs; }; }; config.systemd.services = lib.mkIf cfg.enable (lib.attrsets.mapAttrs' (name: value: let gen = pkgs.formats.toml {}; toml-cfg = gen.generate "config.toml" value; in { name = "vnj-${name}"; value = { wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; description = "VNJ"; serviceConfig = { Type = "simple"; User = cfg.user; ExecStart = "${vnj}/bin/vnj --config ${toml-cfg}"; }; }; } ) cfg.instances); }; in { packages.vnj = vnj; packages.default = vnj; nixosModules.default = nixosModule; devShells.default = pkgs.mkShell { shellHook = '' export PS1="(vnj) $PS1" ''; buildInputs = [ (rust.override { extensions = [ "rust-src" "rust-analyzer" ]; }) ]; }; } ); }