vnj/flake.nix
2024-11-17 18:43:15 +03:00

96 lines
2.3 KiB
Nix

{
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" ];
})
];
};
}
);
}