diff --git a/pkgs/pkgs-lib/formats.nix b/pkgs/pkgs-lib/formats.nix index 879b233bb670..e6806816d1c8 100644 --- a/pkgs/pkgs-lib/formats.nix +++ b/pkgs/pkgs-lib/formats.nix @@ -23,6 +23,7 @@ let pipe singleton strings + toJSON toPretty types versionAtLeast @@ -37,6 +38,7 @@ let toKeyValue toLua mkLuaInline + toPlist ; inherit (lib.types) @@ -142,7 +144,7 @@ optionalAttrs allowAliases aliases runCommand name { nativeBuildInputs = [ jq ]; - value = builtins.toJSON value; + value = toJSON value; preferLocalBuild = true; __structuredAttrs = true; } @@ -167,7 +169,7 @@ optionalAttrs allowAliases aliases runCommand name { nativeBuildInputs = [ remarshal_0_17 ]; - value = builtins.toJSON value; + value = toJSON value; preferLocalBuild = true; __structuredAttrs = true; } @@ -192,7 +194,7 @@ optionalAttrs allowAliases aliases runCommand name { nativeBuildInputs = [ remarshal ]; - value = builtins.toJSON value; + value = toJSON value; preferLocalBuild = true; __structuredAttrs = true; } @@ -250,12 +252,23 @@ optionalAttrs allowAliases aliases description = "section of an INI file (attrs of " + atom.description + ")"; }; - maybeToList = + maybeCoerceList = listToValue: if listToValue != null then mapAttrs (key: val: if isList val then listToValue val else val) else id; + maybeCoerceAllLists = + listToValue: + if listToValue != null then + mapAttrs (_: mapAttrs (key: val: if isList val then listToValue val else val)) + else + id; + + ignoredArgs = [ + "listToValue" + "atomsCoercedToLists" + ]; in { ini = @@ -286,13 +299,8 @@ optionalAttrs allowAliases aliases generate = name: value: pipe value [ - (mapAttrs (_: maybeToList listToValue)) - (toINI ( - removeAttrs args [ - "listToValue" - "atomsCoercedToLists" - ] - )) + (maybeCoerceAllLists listToValue) + (toINI (removeAttrs args ignoredArgs)) (pkgs.writeText name) ]; }; @@ -341,15 +349,10 @@ optionalAttrs allowAliases aliases ... }: pkgs.writeText name ( - toINIWithGlobalSection - (removeAttrs args [ - "listToValue" - "atomsCoercedToLists" - ]) - { - globalSection = maybeToList listToValue globalSection; - sections = mapAttrs (_: maybeToList listToValue) sections; - } + toINIWithGlobalSection (removeAttrs args ignoredArgs) { + globalSection = maybeCoerceList listToValue globalSection; + sections = maybeCoerceAllLists listToValue sections; + } ); }; @@ -357,7 +360,7 @@ optionalAttrs allowAliases aliases { listsAsDuplicateKeys ? false, ... - }@args: + }: let atom = iniAtom { inherit listsAsDuplicateKeys; @@ -396,7 +399,7 @@ optionalAttrs allowAliases aliases // { generate = name: value: - lib.warn + warn "Direct use of `pkgs.formats.systemd` has been deprecated, please use `pkgs.formats.systemd { }` instead." rawFormat.generate name @@ -448,15 +451,15 @@ optionalAttrs allowAliases aliases attrsOf atom; generate = - name: value: let - transformedValue = + transformValue = if listToValue != null then - mapAttrs (key: val: if isList val then listToValue val else val) value + mapAttrs (key: val: if isList val then listToValue val else val) else - value; + id; + finalArgs = removeAttrs args [ "listToValue" ]; in - pkgs.writeText name (toKeyValue (removeAttrs args [ "listToValue" ]) transformedValue); + name: value: pkgs.writeText name (toKeyValue finalArgs (transformValue value)); }; @@ -468,7 +471,7 @@ optionalAttrs allowAliases aliases generate = name: value: pkgs.callPackage ( - { runCommand, remarshal }: + { runCommand }: runCommand name { nativeBuildInputs = [ json2x ]; @@ -496,8 +499,7 @@ optionalAttrs allowAliases aliases */ cdn = { }: - json { } - // { + { type = serializableValueWith { typeName = "CDN"; }; generate = @@ -507,7 +509,7 @@ optionalAttrs allowAliases aliases runCommand name { nativeBuildInputs = [ json2cdn ]; - value = builtins.toJSON value; + value = toJSON value; preferLocalBuild = true; __structuredAttrs = true; } @@ -553,9 +555,6 @@ optionalAttrs allowAliases aliases [Tuple]: */ elixirConf = - { - elixir ? pkgs.elixir, - }: let toElixir = value: @@ -622,12 +621,14 @@ optionalAttrs allowAliases aliases tuple = values: "{${listContent values}}"; toConf = - values: let keyConfig = rootKey: key: value: "config ${rootKey}, ${key}, ${toElixir value}"; keyConfigs = rootKey: values: mapAttrsToList (keyConfig rootKey) values; + in + values: + let rootConfigs = flatten (mapAttrsToList keyConfigs values); in '' @@ -636,6 +637,9 @@ optionalAttrs allowAliases aliases ${concatStringsSep "\n" rootConfigs} ''; in + { + elixir ? pkgs.elixir, + }: { type = let @@ -812,7 +816,7 @@ optionalAttrs allowAliases aliases '' ) { }; # Alias for mkLuaInline - lib.mkRaw = lib.mkLuaInline; + lib.mkRaw = mkLuaInline; }; nixConf = @@ -836,14 +840,12 @@ optionalAttrs allowAliases aliases float str path - package + types.package ]); in attrsOf atomType; generate = - name: value: let - # note that list type has been omitted here as the separator varies, see `nix.settings.*` mkValueString = v: @@ -871,8 +873,8 @@ optionalAttrs allowAliases aliases mkKeyValuePairs = attrs: concatStringsSep "\n" (mapAttrsToList mkKeyValue attrs); isExtra = key: hasPrefix "extra-" key; - in + name: value: pkgs.writeTextFile { inherit name; # workaround for https://github.com/NixOS/nix/issues/9487 @@ -885,7 +887,7 @@ optionalAttrs allowAliases aliases ${mkKeyValuePairs (filterAttrs (key: _: isExtra key) value)} ${extraOptions} ''; - checkPhase = lib.optionalString checkConfig ( + checkPhase = optionalString checkConfig ( if pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform then '' echo "Ignoring validation for cross-compilation" @@ -940,8 +942,8 @@ optionalAttrs allowAliases aliases python3 black ]; - imports = builtins.toJSON (value._imports or [ ]); - value = builtins.toJSON (removeAttrs value [ "_imports" ]); + imports = toJSON (value._imports or [ ]); + value = toJSON (removeAttrs value [ "_imports" ]); pythonGen = pkgs.writeText "pythonGen" '' import json import os @@ -1013,7 +1015,7 @@ optionalAttrs allowAliases aliases python3Packages.xmltodict libxml2Python ]; - value = builtins.toJSON value; + value = toJSON value; pythonGen = pkgs.writeText "pythonGen" '' import json import os @@ -1061,11 +1063,10 @@ optionalAttrs allowAliases aliases in valueType; - generate = name: value: pkgs.writeText name (lib.generators.toPlist { inherit escape; } value); + generate = name: value: pkgs.writeText name (toPlist { inherit escape; } value); }; hcl1 = - args: let # Helper function to recursively transform values for HCL1 canonicalization # Rule: If an attribute value is an attribute set, wrap it in a list @@ -1081,6 +1082,7 @@ optionalAttrs allowAliases aliases value; jsonFormat = json { }; in + args: jsonFormat // { generate = name: value: jsonFormat.generate name (mapAttrs (_: transform) value);