tweak yaml->rust script, generated code compiles and works now :)

This commit is contained in:
B. Petersen
2020-01-28 12:15:26 +01:00
parent d4da2e0d9c
commit 4ba7402f28

View File

@@ -27,50 +27,64 @@ def file2url(f):
def process_data(data, file):
global out_all, out_domains, count
status = data.get("state", "")
status = data.get("status", "")
out_provider = " static ref P" + str(count) + ": Provider = Provider {\n"
if status == "OK" or status == "PREPARATION" or status == "BROKEN":
out_provider += " status: Status::" + status + ",\n"
else:
print("ERROR: bad state")
return
raise TypeError("bad status")
comment = ""
if not "domains" in data:
print("ERROR: no domains found")
return
raise TypeError("no domains found")
for domain in data["domains"]:
out_domains += " (\"" + domain + "\", &*P" + str(count) + "),\n"
comment += domain + ", "
out_server = ""
has_imap = False
has_smtp = False
if "server" in data:
for s in data["server"]:
hostname = cleanstr(s.get("hostname", ""))
port = int(s.get("port", ""))
if hostname == "" or hostname.count(".") < 1 or port <= 0:
print("ERROR: bad hostname or port")
return
out_server += " Server {"
out_server += " protocol: " + s.get("type", "<bad type>").upper() + ","
out_server += " socket: " + s.get("socket", "<bad socket>").upper() + ","
out_server += " hostname: \"" + hostname + "\","
out_server += " port: " + str(port) + ","
out_server += " username_pattern: " + s.get("username_pattern", "EMAIL").upper()
out_server += " }\n"
raise TypeError("bad hostname or port")
out_provider += " before_login_hint: \"" + cleanstr(data.get("before_login_hint", "")) + "\",\n"
out_provider += " after_login_hint: \"" + cleanstr(data.get("after_login_hint", "")) + "\",\n"
out_provider += " overview_page: \"" + file2url(file) + "\",\n"
out_provider += " server: vec![\n" + out_server + " ],\n"
out_provider += " };\n\n"
protocol = s.get("type", "").upper()
if protocol == "IMAP":
has_imap = True
elif protocol == "SMTP":
has_smtp = True
else:
raise TypeError("bad protocol")
out_all += " // " + comment.strip(", ") + "\n" + out_provider
socket = s.get("socket", "").upper()
if socket != "STARTTLS" and socket != "SSL":
raise TypeError("bad socket")
username_pattern = s.get("username_pattern", "EMAIL").upper()
if username_pattern != "EMAIL" and username_pattern != "EMAILLOCALPART":
raise TypeError("bad username pattern")
out_server += (" Server { protocol: " + protocol + ", socket: " + socket + ", hostname: \""
+ hostname + "\", port: " + str(port) + ", username_pattern: " + username_pattern + " },\n")
if (not has_imap and not has_smtp) or (has_imap and has_smtp):
out_provider += " before_login_hint: \"" + cleanstr(data.get("before_login_hint", "")) + "\",\n"
out_provider += " after_login_hint: \"" + cleanstr(data.get("after_login_hint", "")) + "\",\n"
out_provider += " overview_page: \"" + file2url(file) + "\",\n"
out_provider += " server: vec![\n" + out_server + " ],\n"
out_provider += " };\n\n"
else:
raise TypeError("SMTP and IMAP must be specified together or left out both")
out_all += " // " + file[file.rindex("/")+1:] + ": " + comment.strip(", ") + "\n" + out_provider
def process_file(file):
global count
print("processing file: " + file)
print("processing file: " + file, file=sys.stderr)
with open(file) as f:
# load_all() loads "---"-separated yamls -
# by coincidence, this is also the frontmatter separator :)
@@ -80,15 +94,16 @@ def process_file(file):
def process_dir(dir):
print("processing directory: " + dir)
print("processing directory: " + dir, file=sys.stderr)
files = [f for f in os.listdir(dir) if f.endswith(".md")]
files.sort()
for f in files:
process_file(os.path.join(dir, f))
if __name__ == "__main__":
if len(sys.argv) < 2:
raise SystemExit("need argument: path to dir with md/yaml files")
raise SystemExit("usage: update.py DIR_WITH_MD_FILES > data.rs")
out_all = ("// file generated by src/provider/update.py\n\n"
"use crate::provider::*;\n"