pkgs-lib: Implement settings formats for JSON, INI, YAML and TOML

This commit is contained in:
Silvan Mosberger 2020-03-26 02:55:16 +01:00
parent 888c923880
commit b6c540a87c
No known key found for this signature in database
GPG Key ID: E8F1E9EAD284E17D
3 changed files with 115 additions and 2 deletions

View File

@ -2,6 +2,10 @@
# they depend on some packages. This notably is *not* for supporting package
# building, instead pkgs/build-support is the place for that.
{ lib, pkgs }: {
# setting format types and generators. These do not fit in lib/types.nix,
# because they depend on pkgs for rendering some formats
formats = import ./formats.nix {
inherit lib pkgs;
};
}

109
pkgs/pkgs-lib/formats.nix Normal file
View File

@ -0,0 +1,109 @@
{ lib, pkgs }:
rec {
/*
Every following entry represents a format for program configuration files
used for `settings`-style options (see https://github.com/NixOS/rfcs/pull/42).
Each entry should look as follows:
<format> = <parameters>: {
# ^^ Parameters for controlling the format
# The module system type most suitable for representing such a format
# The description needs to be overwritten for recursive types
type = ...;
# generate :: Name -> Value -> Path
# A function for generating a file with a value of such a type
generate = ...;
});
*/
json = {}: {
type = with lib.types; let
valueType = nullOr (oneOf [
bool
int
float
str
(attrsOf valueType)
(listOf valueType)
]) // {
description = "JSON value";
};
in valueType;
generate = name: value: pkgs.runCommandNoCC name {
nativeBuildInputs = [ pkgs.jq ];
value = builtins.toJSON value;
passAsFile = [ "value" ];
} ''
jq . "$valuePath"> $out
'';
};
# YAML has been a strict superset of JSON since 1.2
yaml = {}:
let jsonSet = json {};
in jsonSet // {
type = jsonSet.type // {
description = "YAML value";
};
};
ini = { listsAsDuplicateKeys ? false, ... }@args: {
type = with lib.types; let
singleIniAtom = nullOr (oneOf [
bool
int
float
str
]) // {
description = "INI atom (null, bool, int, float or string)";
};
iniAtom =
if listsAsDuplicateKeys then
coercedTo singleIniAtom lib.singleton (listOf singleIniAtom) // {
description = singleIniAtom.description + " or a list of them for duplicate keys";
}
else
singleIniAtom;
in attrsOf (attrsOf iniAtom);
generate = name: value: pkgs.writeText name (lib.generators.toINI args value);
};
toml = {}: json {} // {
type = with lib.types; let
valueType = oneOf [
bool
int
float
str
(attrsOf valueType)
(listOf valueType)
] // {
description = "TOML value";
};
in valueType;
generate = name: value: pkgs.runCommandNoCC name {
nativeBuildInputs = [ pkgs.remarshal ];
value = builtins.toJSON value;
passAsFile = [ "value" ];
} ''
json2toml "$valuePath" "$out"
'';
};
}

View File

@ -524,7 +524,7 @@ in
writers = callPackage ../build-support/writers {};
# lib functions depending on pkgs
inherit (import ../pkgs-lib { inherit lib pkgs; });
inherit (import ../pkgs-lib { inherit lib pkgs; }) formats;
### TOOLS