{ 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); }