inputs: { config, lib, pkgs, system, ... }: let cfg = config.dyn-gandi; package = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.default; inherit (lib) mkIf mkEnableOption mkOption types; format = pkgs.formats.json {}; configFile = format.generate "config.json" cfg.settings; in { options.dyn-gandi = { enable = mkEnableOption "dyn-gandi"; timer = lib.mkOption { type = types.nullOr types.int; default = null; description = lib.mdDoc '' The time intervall in seconds the script should be repeated. ''; }; settings = mkOption { type = with types; let valueType = nullOr (oneOf [ # TODO: restrict type to actual config file structure bool int float str path (attrsOf valueType) (listOf valueType) ]); in valueType; default = throw "Please specify dyn-gandi.settings"; }; }; config = mkIf cfg.enable { environment = { systemPackages = [package]; # etc."dyn-gandi.json" = { # text = builtins.toJSON cfg.settings; # }; }; systemd.services.dyn-gandi = mkIf (cfg.timer != null) { script = "${package}/bin/dyn_gandi --config ${configFile}"; serviceConfig = { Type = "oneshot"; }; }; systemd.timers.dyn-gandi = mkIf (cfg.timer != null) { wantedBy = ["timers.target"]; timerConfig = { OnBootSec = "0s"; OnUnitActiveSec = "${toString cfg.timer}s"; Unit = "dyn-gandi.service"; }; }; }; }