{ lib }: let inherit (lib.types) str; inherit (lib.options) mkOption mkEnableOption; inherit (lib.attrsets) recursiveUpdate; mkGraphicalService = recursiveUpdate { Unit.PartOf = [ "graphical-session.target" ]; Unit.After = [ "graphical-session.target" ]; Install.WantedBy = [ "graphical-session.target" ]; }; mkHyprlandService = recursiveUpdate { Unit.PartOf = [ "graphical-session.target" ]; Unit.After = [ "graphical-session.target" ]; Install.WantedBy = [ "hyprland-session.target" ]; }; /** A quick way to use my services abstraction # Arguments - [name]: The name of the service # Type ``` mkServiceOption :: String -> (Int -> String -> String -> AttrSet) -> AttrSet ``` */ mkServiceOption = name: { port ? 0, host ? "127.0.0.1", domain ? "", extraConfig ? { }, }: { enable = mkEnableOption "Enable the ${name} service"; host = mkOption { type = str; default = host; description = "The host for ${name} service"; }; port = mkOption { type = lib.types.port; default = port; description = "The port for ${name} service"; }; domain = mkOption { type = str; default = domain; description = "Domain name for the ${name} service"; }; } // extraConfig; in { inherit mkGraphicalService mkHyprlandService mkServiceOption; }