nixos-mailserver/scripts/generate-options.py
2025-05-15 16:29:04 +02:00

92 lines
2.1 KiB
Python

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)