{ lib }: with lib.attrsets; with lib.strings; with lib.lists; with lib.trivial; let pad = width: str: let padWidth = width - stringLength str; padding = concatStrings (genList (const " ") padWidth); in str + optionalString (padWidth > 0) padding; toStr = k: v: if k == "check_command" && builtins.isList v then builtins.concatStringsSep "!" v else v; toService = service: '' define service { ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v: " ${pad 30 k} ${toStr k v}" ) (filterAttrs (k: v: ! builtins.elem k ["passiveInfo" "filter"]) service))} } ''; toServices = services: builtins.concatStringsSep "\n" (map toService services); toCommand = k: v: '' define command { ${pad 30 "command_name"} ${k} ${pad 30 "command_line"} ${v} } ''; toCommands = a: builtins.concatStringsSep "\n" (mapAttrsToList toCommand a); toOther = keyname: k: v: '' define ${keyname} { ${pad 30 "${keyname}_name"} ${k} ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv: " ${pad 30 kk} ${vv}" ) v)} } ''; toOtherNoName = keyname: v: '' define ${keyname} { ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv: " ${pad 30 kk} ${vv}" ) v)} } ''; toOthers = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toOther keyname) a); toOthersArray = keyname: a: builtins.concatStringsSep "\n" (map (toOtherNoName keyname) a); toTemplate = keyname: k: v: '' define ${keyname} { ${pad 30 "name"} ${k} ${pad 30 "register"} 0 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv: " ${pad 30 kk} ${vv}" ) v)} } ''; toTemplates' = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toTemplate keyname) a); toTemplates = v: builtins.concatStringsSep "\n" (mapAttrsToList toTemplates' v); toObjects' = keyname: v: if keyname == "service" then toServices v else if keyname == "command" then toCommands v else if keyname == "templates" then toTemplates v else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"] then toOthers keyname v else if builtins.elem keyname ["servicedependency"] then toOthersArray keyname v else ""; toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v); in toObjects