diff --git a/scripts/create-provider-data-rs.py b/scripts/create-provider-data-rs.py index 681872ff5..ea5d291ee 100755 --- a/scripts/create-provider-data-rs.py +++ b/scripts/create-provider-data-rs.py @@ -11,15 +11,17 @@ out_domains = "" out_ids = "" domains_set = set() + def camel(name): words = name.split("_") return "".join(w.capitalize() for i, w in enumerate(words)) + def cleanstr(s): s = s.strip() s = s.replace("\n", " ") s = s.replace("\\", "\\\\") - s = s.replace("\"", "\\\"") + s = s.replace('"', '\\"') return s @@ -64,7 +66,13 @@ def process_config_defaults(data): config_defaults = data.get("config_defaults", "") for key in config_defaults: value = str(config_defaults[key]) - defaults += " ConfigDefault { key: Config::" + camel(key) + ", value: \"" + value + "\" },\n" + defaults += ( + " ConfigDefault { key: Config::" + + camel(key) + + ', value: "' + + value + + '" },\n' + ) defaults += " ])" return defaults @@ -88,11 +96,11 @@ def process_data(data, file): raise TypeError("domain used twice: " + domain) domains_set.add(domain) - domains += " (\"" + domain + "\", &*" + file2varname(file) + "),\n" + domains += ' ("' + domain + '", &*' + file2varname(file) + "),\n" comment += domain + ", " ids = "" - ids += " (\"" + file2id(file) + "\", &*" + file2varname(file) + "),\n" + ids += ' ("' + file2id(file) + '", &*' + file2varname(file) + "),\n" server = "" has_imap = False @@ -120,8 +128,19 @@ def process_data(data, file): if username_pattern != "EMAIL" and username_pattern != "EMAILLOCALPART": raise TypeError("bad username pattern") - server += (" Server { protocol: " + protocol.capitalize() + ", socket: " + socket.capitalize() + ", hostname: \"" - + hostname + "\", port: " + str(port) + ", username_pattern: " + username_pattern.capitalize() + " },\n") + server += ( + " Server { protocol: " + + protocol.capitalize() + + ", socket: " + + socket.capitalize() + + ', hostname: "' + + hostname + + '", port: ' + + str(port) + + ", username_pattern: " + + username_pattern.capitalize() + + " },\n" + ) opt = process_opt(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", "")) after_login_hint = cleanstr(data.get("after_login_hint", "")) if (not has_imap and not has_smtp) or (has_imap and has_smtp): - provider += "static " + file2varname(file) + ": Lazy = Lazy::new(|| Provider {\n" - provider += " id: \"" + file2id(file) + "\",\n" + provider += ( + "static " + + file2varname(file) + + ": Lazy = Lazy::new(|| Provider {\n" + ) + provider += ' id: "' + file2id(file) + '",\n' provider += " status: Status::" + status.capitalize() + ",\n" - provider += " before_login_hint: \"" + before_login_hint + "\",\n" - provider += " after_login_hint: \"" + after_login_hint + "\",\n" - provider += " overview_page: \"" + file2url(file) + "\",\n" + provider += ' before_login_hint: "' + before_login_hint + '",\n' + provider += ' after_login_hint: "' + after_login_hint + '",\n' + provider += ' overview_page: "' + file2url(file) + '",\n' provider += " server: vec![\n" + server + " ],\n" provider += " opt: " + opt + ",\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") 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 global out_all, out_domains, out_ids @@ -172,7 +197,7 @@ def process_file(file): def process_dir(dir): 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: process_file(f) @@ -181,31 +206,41 @@ if __name__ == "__main__": if len(sys.argv) < 2: 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::Protocol::*;\n" - "use crate::provider::Socket::*;\n" - "use crate::provider::UsernamePattern::*;\n" - "use crate::provider::{\n" - " Config, ConfigDefault, Oauth2Authorizer, Provider, ProviderOptions, Server, Status,\n" - "};\n" - "use std::collections::HashMap;\n\n" - "use once_cell::sync::Lazy;\n\n") + out_all = ( + "// file generated by src/provider/update.py\n\n" + "use crate::provider::Protocol::*;\n" + "use crate::provider::Socket::*;\n" + "use crate::provider::UsernamePattern::*;\n" + "use crate::provider::{\n" + " Config, ConfigDefault, Oauth2Authorizer, Provider, ProviderOptions, Server, Status,\n" + "};\n" + "use std::collections::HashMap;\n\n" + "use once_cell::sync::Lazy;\n\n" + ) process_dir(Path(sys.argv[1])) out_all += "pub(crate) static PROVIDER_DATA: Lazy> = Lazy::new(|| [\n" - out_all += out_domains; + out_all += out_domains out_all += "].iter().copied().collect());\n\n" out_all += "pub(crate) static PROVIDER_IDS: Lazy> = Lazy::new(|| [\n" - out_all += out_ids; + out_all += out_ids out_all += "].iter().copied().collect());\n\n" if len(sys.argv) < 3: now = datetime.datetime.utcnow() else: now = datetime.datetime.fromisoformat(sys.argv[2]) - out_all += "pub static PROVIDER_UPDATED: Lazy = "\ - "Lazy::new(|| chrono::NaiveDate::from_ymd_opt("+str(now.year)+", "+str(now.month)+", "+str(now.day)+").unwrap());\n" + out_all += ( + "pub static PROVIDER_UPDATED: Lazy = " + "Lazy::new(|| chrono::NaiveDate::from_ymd_opt(" + + str(now.year) + + ", " + + str(now.month) + + ", " + + str(now.day) + + ").unwrap());\n" + ) print(out_all)