Autoformat create-provider-data-rs.py

This commit is contained in:
link2xt
2023-02-26 20:54:40 +00:00
parent 0086232bbb
commit a2f1df052b

View File

@@ -11,15 +11,17 @@ out_domains = ""
out_ids = "" out_ids = ""
domains_set = set() domains_set = set()
def camel(name): def camel(name):
words = name.split("_") words = name.split("_")
return "".join(w.capitalize() for i, w in enumerate(words)) return "".join(w.capitalize() for i, w in enumerate(words))
def cleanstr(s): def cleanstr(s):
s = s.strip() s = s.strip()
s = s.replace("\n", " ") s = s.replace("\n", " ")
s = s.replace("\\", "\\\\") s = s.replace("\\", "\\\\")
s = s.replace("\"", "\\\"") s = s.replace('"', '\\"')
return s return s
@@ -64,7 +66,13 @@ def process_config_defaults(data):
config_defaults = data.get("config_defaults", "") config_defaults = data.get("config_defaults", "")
for key in config_defaults: for key in config_defaults:
value = str(config_defaults[key]) value = str(config_defaults[key])
defaults += " ConfigDefault { key: Config::" + camel(key) + ", value: \"" + value + "\" },\n" defaults += (
" ConfigDefault { key: Config::"
+ camel(key)
+ ', value: "'
+ value
+ '" },\n'
)
defaults += " ])" defaults += " ])"
return defaults return defaults
@@ -88,11 +96,11 @@ def process_data(data, file):
raise TypeError("domain used twice: " + domain) raise TypeError("domain used twice: " + domain)
domains_set.add(domain) domains_set.add(domain)
domains += " (\"" + domain + "\", &*" + file2varname(file) + "),\n" domains += ' ("' + domain + '", &*' + file2varname(file) + "),\n"
comment += domain + ", " comment += domain + ", "
ids = "" ids = ""
ids += " (\"" + file2id(file) + "\", &*" + file2varname(file) + "),\n" ids += ' ("' + file2id(file) + '", &*' + file2varname(file) + "),\n"
server = "" server = ""
has_imap = False has_imap = False
@@ -120,8 +128,19 @@ def process_data(data, file):
if username_pattern != "EMAIL" and username_pattern != "EMAILLOCALPART": if username_pattern != "EMAIL" and username_pattern != "EMAILLOCALPART":
raise TypeError("bad username pattern") raise TypeError("bad username pattern")
server += (" Server { protocol: " + protocol.capitalize() + ", socket: " + socket.capitalize() + ", hostname: \"" server += (
+ hostname + "\", port: " + str(port) + ", username_pattern: " + username_pattern.capitalize() + " },\n") " Server { protocol: "
+ protocol.capitalize()
+ ", socket: "
+ socket.capitalize()
+ ', hostname: "'
+ hostname
+ '", port: '
+ str(port)
+ ", username_pattern: "
+ username_pattern.capitalize()
+ " },\n"
)
opt = process_opt(data) opt = process_opt(data)
config_defaults = process_config_defaults(data) config_defaults = process_config_defaults(data)
@@ -133,12 +152,16 @@ def process_data(data, file):
before_login_hint = cleanstr(data.get("before_login_hint", "")) before_login_hint = cleanstr(data.get("before_login_hint", ""))
after_login_hint = cleanstr(data.get("after_login_hint", "")) after_login_hint = cleanstr(data.get("after_login_hint", ""))
if (not has_imap and not has_smtp) or (has_imap and has_smtp): if (not has_imap and not has_smtp) or (has_imap and has_smtp):
provider += "static " + file2varname(file) + ": Lazy<Provider> = Lazy::new(|| Provider {\n" provider += (
provider += " id: \"" + file2id(file) + "\",\n" "static "
+ file2varname(file)
+ ": Lazy<Provider> = Lazy::new(|| Provider {\n"
)
provider += ' id: "' + file2id(file) + '",\n'
provider += " status: Status::" + status.capitalize() + ",\n" provider += " status: Status::" + status.capitalize() + ",\n"
provider += " before_login_hint: \"" + before_login_hint + "\",\n" provider += ' before_login_hint: "' + before_login_hint + '",\n'
provider += " after_login_hint: \"" + after_login_hint + "\",\n" provider += ' after_login_hint: "' + after_login_hint + '",\n'
provider += " overview_page: \"" + file2url(file) + "\",\n" provider += ' overview_page: "' + file2url(file) + '",\n'
provider += " server: vec![\n" + server + " ],\n" provider += " server: vec![\n" + server + " ],\n"
provider += " opt: " + opt + ",\n" provider += " opt: " + opt + ",\n"
provider += " config_defaults: " + config_defaults + ",\n" provider += " config_defaults: " + config_defaults + ",\n"
@@ -148,7 +171,9 @@ def process_data(data, file):
raise TypeError("SMTP and IMAP must be specified together or left out both") raise TypeError("SMTP and IMAP must be specified together or left out both")
if status != "OK" and before_login_hint == "": if status != "OK" and before_login_hint == "":
raise TypeError("status PREPARATION or BROKEN requires before_login_hint: " + file) raise TypeError(
"status PREPARATION or BROKEN requires before_login_hint: " + file
)
# finally, add the provider # finally, add the provider
global out_all, out_domains, out_ids global out_all, out_domains, out_ids
@@ -172,7 +197,7 @@ def process_file(file):
def process_dir(dir): def process_dir(dir):
print("processing directory: {}".format(dir), file=sys.stderr) print("processing directory: {}".format(dir), file=sys.stderr)
files = sorted(f for f in dir.iterdir() if f.suffix == '.md') files = sorted(f for f in dir.iterdir() if f.suffix == ".md")
for f in files: for f in files:
process_file(f) process_file(f)
@@ -181,31 +206,41 @@ if __name__ == "__main__":
if len(sys.argv) < 2: if len(sys.argv) < 2:
raise SystemExit("usage: update.py DIR_WITH_MD_FILES > data.rs") raise SystemExit("usage: update.py DIR_WITH_MD_FILES > data.rs")
out_all = ("// file generated by src/provider/update.py\n\n" out_all = (
"use crate::provider::Protocol::*;\n" "// file generated by src/provider/update.py\n\n"
"use crate::provider::Socket::*;\n" "use crate::provider::Protocol::*;\n"
"use crate::provider::UsernamePattern::*;\n" "use crate::provider::Socket::*;\n"
"use crate::provider::{\n" "use crate::provider::UsernamePattern::*;\n"
" Config, ConfigDefault, Oauth2Authorizer, Provider, ProviderOptions, Server, Status,\n" "use crate::provider::{\n"
"};\n" " Config, ConfigDefault, Oauth2Authorizer, Provider, ProviderOptions, Server, Status,\n"
"use std::collections::HashMap;\n\n" "};\n"
"use once_cell::sync::Lazy;\n\n") "use std::collections::HashMap;\n\n"
"use once_cell::sync::Lazy;\n\n"
)
process_dir(Path(sys.argv[1])) process_dir(Path(sys.argv[1]))
out_all += "pub(crate) static PROVIDER_DATA: Lazy<HashMap<&'static str, &'static Provider>> = Lazy::new(|| [\n" out_all += "pub(crate) static PROVIDER_DATA: Lazy<HashMap<&'static str, &'static Provider>> = Lazy::new(|| [\n"
out_all += out_domains; out_all += out_domains
out_all += "].iter().copied().collect());\n\n" out_all += "].iter().copied().collect());\n\n"
out_all += "pub(crate) static PROVIDER_IDS: Lazy<HashMap<&'static str, &'static Provider>> = Lazy::new(|| [\n" out_all += "pub(crate) static PROVIDER_IDS: Lazy<HashMap<&'static str, &'static Provider>> = Lazy::new(|| [\n"
out_all += out_ids; out_all += out_ids
out_all += "].iter().copied().collect());\n\n" out_all += "].iter().copied().collect());\n\n"
if len(sys.argv) < 3: if len(sys.argv) < 3:
now = datetime.datetime.utcnow() now = datetime.datetime.utcnow()
else: else:
now = datetime.datetime.fromisoformat(sys.argv[2]) now = datetime.datetime.fromisoformat(sys.argv[2])
out_all += "pub static PROVIDER_UPDATED: Lazy<chrono::NaiveDate> = "\ out_all += (
"Lazy::new(|| chrono::NaiveDate::from_ymd_opt("+str(now.year)+", "+str(now.month)+", "+str(now.day)+").unwrap());\n" "pub static PROVIDER_UPDATED: Lazy<chrono::NaiveDate> = "
"Lazy::new(|| chrono::NaiveDate::from_ymd_opt("
+ str(now.year)
+ ", "
+ str(now.month)
+ ", "
+ str(now.day)
+ ").unwrap());\n"
)
print(out_all) print(out_all)