{ 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 = let sArgs = [ dCfg.path (toString dCfg.maxSize) ] + (optional (dCfg.monitorTimeout != null) dCfg.monitorTimeout); in "${pkgs.rolling-directory}/bin/rolling-directory ${escapeShellArgs sArgs}"; }; }; 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); }; }