pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / pkgs-lib / formats / hocon / default.nix
blob3be57061bb53120c40bec06df6aba62d9ecf188b
1 { lib
2 , pkgs
3 }:
4 let
5   inherit (pkgs) buildPackages callPackage;
7   hocon-generator = buildPackages.rustPlatform.buildRustPackage {
8     name = "hocon-generator";
9     version = "0.1.0";
10     src = ./src;
12     passthru.updateScript = ./update.sh;
14     cargoLock.lockFile = ./src/Cargo.lock;
15   };
17   hocon-validator = pkgs.writers.writePython3Bin "hocon-validator" {
18     libraries = [ pkgs.python3Packages.pyhocon ];
19   } ''
20     from sys import argv
21     from pyhocon import ConfigFactory
23     if not len(argv) == 2:
24         print("USAGE: hocon-validator <file>")
26     ConfigFactory.parse_file(argv[1])
27   '';
30   format = {
31     generator ? hocon-generator
32     , validator ? hocon-validator
33     , doCheck ? true
34   }: let
35     hoconLib = {
36       mkInclude = value: let
37         includeStatement = if lib.isAttrs value && !(lib.isDerivation value) then {
38           required = false;
39           type = null;
40           _type = "include";
41         } // value else {
42           value = toString value;
43           required = false;
44           type = null;
45           _type = "include";
46         };
47       in
48         assert lib.assertMsg (lib.elem includeStatement.type [ "file" "url" "classpath" null ]) ''
49           Type of HOCON mkInclude is not of type 'file', 'url' or 'classpath':
50           ${(lib.generators.toPretty {}) includeStatement}
51         '';
52         includeStatement;
54       mkAppend = value: {
55         inherit value;
56         _type = "append";
57       };
59       mkSubstitution = value:
60       if lib.isString value
61         then
62           {
63             inherit value;
64             optional = false;
65             _type = "substitution";
66           }
67         else
68           assert lib.assertMsg (lib.isAttrs value) ''
69             Value of invalid type provided to `hocon.lib.mkSubstitution`: ${lib.typeOf value}
70           '';
71           assert lib.assertMsg (value ? "value") ''
72             Argument to `hocon.lib.mkSubstitution` is missing a `value`:
73             ${builtins.toJSON value}
74           '';
75           {
76             value = value.value;
77             optional = value.optional or false;
78             _type = "substitution";
79           };
80     };
82   in {
83     type = let
84       type' = with lib.types; let
85         atomType = nullOr (oneOf [
86           bool
87           float
88           int
89           path
90           str
91         ]);
92       in (oneOf [
93         atomType
94         (listOf atomType)
95         (attrsOf type')
96       ]) // {
97         description = "HOCON value";
98       };
99     in type';
101     lib = hoconLib;
103     generate = name: value:
104       let
105         # TODO: remove in 24.11
106         # Backwards compatibility for generators in the following locations:
107         #  - nixos/modules/services/networking/jibri/default.nix (__hocon_envvar)
108         #  - nixos/modules/services/networking/jicofo.nix (__hocon_envvar, __hocon_unquoted_string)
109         #  - nixos/modules/services/networking/jitsi-videobridge.nix (__hocon_envvar)
110         replaceOldIndicators = value:
111           if lib.isAttrs value then
112             (if value ? "__hocon_envvar"
113               then
114               lib.warn ''
115                 Use of `__hocon_envvar` has been deprecated, and will
116                 be removed in the future.
118                 Please use `(pkgs.formats.hocon {}).lib.mkSubstitution` instead.
119               ''
120               (hoconLib.mkSubstitution value.__hocon_envvar)
121             else if value ? "__hocon_unquoted_string"
122               then
123               lib.warn ''
124                 Use of `__hocon_unquoted_string` has been deprecated, and will
125                 be removed in the future.
127                 Please make use of the freeform options of
128                 `(pkgs.formats.hocon {}).format` instead.
129               ''
130               {
131                 value = value.__hocon_unquoted_string;
132                 _type = "unquoted_string";
133               }
134             else lib.mapAttrs (_: replaceOldIndicators) value)
135           else if lib.isList value
136             then map replaceOldIndicators value
137           else value;
139         finalValue = replaceOldIndicators value;
140       in
141       callPackage
142         ({
143           stdenvNoCC
144         , hocon-generator
145         , hocon-validator
146         , writeText
147         }:
148         stdenvNoCC.mkDerivation rec {
149           inherit name;
151           dontUnpack = true;
152           preferLocalBuild = true;
154           json = builtins.toJSON finalValue;
155           passAsFile = [ "json" ];
157           strictDeps = true;
158           nativeBuildInputs = [ hocon-generator ];
159           buildPhase = ''
160             runHook preBuild
161             hocon-generator < $jsonPath > output.conf
162             runHook postBuild
163           '';
165           inherit doCheck;
166           nativeCheckInputs = [ hocon-validator ];
167           checkPhase = ''
168             runHook preCheck
169             hocon-validator output.conf
170             runHook postCheck
171           '';
173           installPhase = ''
174             runHook preInstall
175             mv output.conf $out
176             runHook postInstall
177           '';
179           passthru.json = writeText "${name}.json" json;
180         })
181         {
182           hocon-generator = generator;
183           hocon-validator = validator;
184         };
185   };