{ writeTextFile, linkFarm, lib, ... }: { name, config, ... }: with builtins // lib; let sanitize = p: let safeChars = [ "+" "." "_" "?" "=" ] ++ lowerChars ++ upperChars ++ stringToCharacters "0123456789"; empties = l: genList (_: "") (length l); unsafeInName = stringToCharacters (replaceStrings safeChars (empties safeChars) p); in "kobo_" + replaceStrings unsafeInName (empties unsafeInName) p; in { options = { enable = mkEnableOption name // { default = true; }; name = mkOption { type = types.str; }; target = mkOption { type = types.str; default = name; apply = x: if hasPrefix "/" x then x else "/${x}"; }; executable = mkOption { type = with types; nullOr bool; default = null; }; text = mkOption { type = with types; nullOr lines; default = null; }; source = mkOption { type = types.path; }; _package = mkOption { type = types.path; readOnly = true; internal = true; default = linkFarm (sanitize name) [{ name = removePrefix "/" config.target; # let # t = config.target; # in if path = config.source; }]; }; }; config = { source = mkIf (config.text != null) (mkDefault (writeTextFile { inherit (config) text; name = sanitize name; executable = config.executable == true; })); }; }