diff --git a/fn.nix b/fn.nix index 2633632..3ea5a36 100644 --- a/fn.nix +++ b/fn.nix @@ -69,4 +69,11 @@ rec { true) )) ld); + makeOptionTypeList = path: (lists.forEach + # get a list of all files ending in .nix in path + (filter (filePath: hasSuffix ".nix" filePath) + (lsfRec path true)) + # remove leading path and trailing ".nix", replace every slash with "::" + (replaceStrings [ "${path}/" "/" ".nix" ] [ "" "::" "" ]) + ); } diff --git a/options/machine.nix b/options/machine.nix index 1362671..e096c06 100644 --- a/options/machine.nix +++ b/options/machine.nix @@ -5,9 +5,8 @@ with lib; let cfg = config.machine; - metapkgs = let - pPath = (toString ../pkgsets); - in (lists.forEach (fn.lsfRec pPath true) (v: replaceStrings [ "${pPath}/" "/" ".nix" ] [ "" "::" "" ] v)); + pkgsetList = fn.makeOptionTypeList (toString ../pkgsets); + serviceList = fn.makeOptionTypeList (toString ../services); pkgOption = pname: { name = pname; value = rec { @@ -30,16 +29,16 @@ let in { options.machine = { pkgs = mkOption { - type = (types.listOf (types.enum metapkgs)); + type = (types.listOf (types.enum pkgsetList)); default = [ "base" ]; description = '' The list of metapackages to be installed. ''; }; # Package names containing '::' are sub packages and should not have their own pkgset. - pkgsets = listToAttrs (map pkgOption (lists.filter (v: !(strings.hasInfix "::" v)) metapkgs)); + pkgsets = listToAttrs (map pkgOption (lists.filter (v: !(strings.hasInfix "::" v)) pkgsetList)); services = mkOption { - type = types.listOf types.str; + type = (types.listOf (types.enum serviceList)); default = []; description = '' List of services to be enabled.