import json import sys header = """ # Mailserver options ## `mailserver` """ template = """ `````{{option}} {key} {description} {type} {default} {example} ````` """ f = open(sys.argv[1]) options = json.load(f) groups = [ "mailserver.loginAccounts", "mailserver.certificate", "mailserver.dkim", "mailserver.dmarcReporting", "mailserver.fullTextSearch", "mailserver.redis", "mailserver.ldap", "mailserver.monitoring", "mailserver.backup", "mailserver.borgbackup", ] def render_option_value(opt, attr): if attr not in opt: return "" if isinstance(opt[attr], dict) and "_type" in opt[attr]: if opt[attr]["_type"] == "literalExpression": if "\n" in opt[attr]["text"]: text = opt[attr]["text"].rstrip("\n") res = f"\n```nix\n{text}\n```" else: res = f"```{opt[attr]["text"]}```" elif opt[attr]["_type"] == "literalMD": res = opt[attr]["text"] else: assert RuntimeError(f"Unhandled option type {opt[attr]["_type"]}") else: s = str(opt[attr]) if s == "": res = '`""`' elif "\n" in s: res = f"\n```\n{s.rstrip("\n")}\n```" else: res = f"```{s}```" return "- " + attr + ": " + res # type: ignore def print_option(opt): if isinstance(opt["description"], dict) and "_type" in opt["description"]: # mdDoc description = opt["description"]["text"] else: description = opt["description"] print( template.format( key=opt["name"], description=description or "", type=f"- type: ```{opt["type"]}```", default=render_option_value(opt, "default"), example=render_option_value(opt, "example"), ) ) print(header) for opt in options: if any([opt["name"].startswith(c) for c in groups]): continue print_option(opt) for c in groups: print(f"## `{c}`\n") for opt in options: if opt["name"].startswith(c): print_option(opt)