{ config, pkgs, lib, utils, ... }: with utils; with lib; let dirConfig = { options = { path = mkOption { type = types.path; }; maxSize = mkOption { type = with types; either ints.positive str; }; monitorTimeout = mkOption { type = with types; nullOr ints.positive; default = 3600; }; }; }; dirService = dCfg: nameValuePair ("rolling-directory@" + escapeSystemdPath dCfg.path) { wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = '' ${pkgs.rolling-directory}/bin/rolling-directory %I ${toString dCfg.maxSize} monitor ${optionalString (dCfg.monitorTimeout != null) (toString dCfg.monitorTimeout)} ''; }; }; in { options = { services.rollingDirectories = mkOption { type = with types; listOf (submodule dirConfig); default = []; }; }; config = { nixpkgs.config.packageOverrides = import ./default.nix; systemd.services = listToAttrs (map dirService config.services.rollingDirectories); }; }