mirror of
https://github.com/javalsai/lidm.git
synced 2025-08-30 09:58:00 +02:00
74 lines
2.1 KiB
Nix
74 lines
2.1 KiB
Nix
{ lib, keys-h-file }:
|
|
|
|
let
|
|
double-match-to-nameval = dmatch: {
|
|
name = builtins.elemAt dmatch 0;
|
|
value = builtins.elemAt dmatch 1;
|
|
};
|
|
|
|
keys-enum =
|
|
let
|
|
key-names = builtins.replaceStrings [ "\n" " " ] [ "" "" ] (
|
|
builtins.elemAt (builtins.match ".*KEY_NAMES\\[][[:blank:]]*=[[:blank:]]*\\{([^}]*)}.*" keys-h-file) 0
|
|
);
|
|
|
|
keys-2d-list = builtins.map (builtins.match "\\[(.*)]=\"(.*)\"") (
|
|
builtins.filter (s: builtins.isString s && s != "") (builtins.split "," key-names)
|
|
);
|
|
|
|
in
|
|
builtins.listToAttrs (
|
|
builtins.map (
|
|
k:
|
|
k
|
|
// {
|
|
value = {
|
|
__enum_key = k.value;
|
|
};
|
|
}
|
|
) (builtins.map double-match-to-nameval keys-2d-list)
|
|
);
|
|
in
|
|
{
|
|
inherit keys-enum;
|
|
make =
|
|
let
|
|
name-val-to-attrs = (name: value: { inherit name value; });
|
|
map-attrs = attrset: fn: lib.map fn (lib.attrsets.mapAttrsToList name-val-to-attrs attrset);
|
|
|
|
try-foldl' =
|
|
op: nul: list:
|
|
if (builtins.length list) == 0 then "" else builtins.foldl' op nul list;
|
|
concat-with = sepr: list: try-foldl' (x: y: if x == null then y else x + sepr + y) null list;
|
|
|
|
ser-bool = bool: if bool then "true" else "false";
|
|
ser-str = str: "\"${builtins.replaceStrings [ "\n" "\"" ] [ "\\n" "\\\"" ] str}\"";
|
|
ser-kvs =
|
|
{ name, value }:
|
|
if builtins.isList value then
|
|
concat-with "\n" (builtins.map (value: ser-kvs { inherit name value; }) value)
|
|
else
|
|
"${name} = ${
|
|
if builtins.isString value then
|
|
ser-str value
|
|
else if builtins.isInt value then
|
|
builtins.toString value
|
|
else if builtins.isBool value then
|
|
ser-bool value
|
|
else if builtins.isAttrs value then
|
|
value.__enum_key
|
|
else
|
|
builtins.throw "type not supported"
|
|
}";
|
|
|
|
ser-table =
|
|
table':
|
|
let
|
|
tname = table'.name;
|
|
table = table'.value;
|
|
in
|
|
"[${tname}]\n" + (concat-with "\n" (map-attrs table ser-kvs));
|
|
in
|
|
cfg: concat-with "\n\n" (map-attrs cfg ser-table);
|
|
}
|