diff options
Diffstat (limited to 'src/client_ext/generate.py')
-rw-r--r-- | src/client_ext/generate.py | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/src/client_ext/generate.py b/src/client_ext/generate.py index 16ed400..2ed9048 100644 --- a/src/client_ext/generate.py +++ b/src/client_ext/generate.py @@ -5,9 +5,7 @@ from collections import defaultdict from typing import Optional import sys -# TODO: rename mixedCase - -wanted_types = [ +wanted_types = { 'User', 'Chat', 'Message', @@ -16,24 +14,27 @@ wanted_types = [ 'PhotoSize', 'Ok', 'TdlibParameters', - 'PhoneNumberAuthenticationSettings' -] + 'PhoneNumberAuthenticationSettings', +} -wanted_classes = [ +wanted_classes = { 'AuthorizationState', - 'MessageContent', - 'Update' -] + #'MessageContent', + 'Update', + 'UserStatus', +} -wanted_methods = [ +wanted_methods = { + 'get_me', 'set_tdlib_parameters', 'get_network_statistics', 'get_application_config', + 'get_authorization_state', 'set_database_encryption_key', 'set_authentication_phone_number', 'check_authentication_code', - 'check_authentication_password' -] + 'check_authentication_password', +} if not "REMOVE 'NOT' IF YOU WANT EVERYTHING TO BE RENDERED": with open('everything.json') as f: @@ -99,12 +100,10 @@ class Field: mod: Mod = dataclass_field(default_factory=Mod) optional: bool = False doc_modifier: Optional[object] = None - orig_name: str = None def __post_init__(self): self.doc = escape_doc(self.doc) - self.orig_name = self.name - self.name = to_snake_case(self.name) + assert(self.name == to_snake_case(self.name)) self.check_optional() def check_optional(self): @@ -128,11 +127,12 @@ class Field: def get_typename(self) -> str: typename = self.type_ + if self.mod.exclude: + typename = f'SerdeJsonValue' if self.optional: typename = f'Option<{typename}>' if self.mod.exclude: self.doc_modifier = f' \\n\\nOriginal type: {typename}' - typename = f'SerdeJsonValue' return typename @@ -152,9 +152,11 @@ class Type: doc: str fields: list[Field] exclude: bool = False + non_camel_name: Optional[str] = None def __post_init__(self): self.doc = escape_doc(self.doc) + self.non_camel_name = self.name self.name = to_camel_case(self.name) if self.name not in wanted_types: self.exclude = True @@ -165,9 +167,11 @@ class Class: name: str doc: Optional[str] members: list[str] + non_camel_name: Optional[str] = None def __post_init__(self): self.doc = escape_doc(self.doc) + self.non_camel_name = self.name self.name = to_camel_case(self.name) @dataclass @@ -294,29 +298,32 @@ methods = dict() for decl in parsed_types.children: if decl.data == 'decl': description, type_name, fields, base_type = parse_decl(decl) + type_name_orig = type_name + base_type_orig = base_type type_name = to_camel_case(type_name.value) base_type = to_camel_case(base_type.value) - types[type_name] = Type(name=type_name, doc=description, fields=fields) + types[type_name] = Type(name=type_name_orig, doc=description, fields=fields) if type_name != base_type: if base_type not in classes: - classes[base_type] = Class(name=base_type, doc=None, members=[type_name]) + classes[base_type] = Class(name=base_type_orig, doc=None, members=[type_name]) else: classes[base_type].members.append(type_name) else: classname, doc = decl.children + class_name_camel = to_camel_case(classname) doc = ''.join(doc.children[1].children) if classname not in classes: - classes[classname] = Class(name=classname, doc=doc, members=[]) + classes[class_name_camel] = Class(name=classname, doc=doc, members=[]) else: - classes[classname].doc = doc + classes[class_name_camel].doc = doc -classes = dict([(k, v) for (k, v) in classes.items() if k.value not in CLASS_EXCLUDE_ALWAYS]) +classes = dict([(k, v) for (k, v) in classes.items() if k not in CLASS_EXCLUDE_ALWAYS]) types = dict([(k, v) for (k, v) in types.items() if k not in TYPE_EXCLUDE_ALWAYS]) for w in wanted_classes: - if w not in [c.value for c in classes]: + if w not in [c for c in classes]: eprint(f'WARN: {w} class is wanted, but not found') for w in wanted_types: @@ -353,6 +360,19 @@ for class_ in [cls for cls in classes.values() if cls.name in wanted_classes]: else: type_.exclude = False +print(''' +#![allow(unused)] +use serde::Deserializer; +use tdlib_rs::client::ClientLike; + +use serde::Deserialize; +use serde_derive::{Serialize, Deserialize}; +use serde_json::{json, Value as SerdeJsonValue}; +use tdlib_rs::Client; +use tdlib_rs::client::ResponseFuture; +use super::{deserialize_i64_0, deserialize_i64_1}; +'''.lstrip()) + for type_ in [tp for tp in types.values() if not tp.exclude]: print(f'#[derive(Serialize, Deserialize, Debug, Clone)]') print(f'#[doc="{type_.doc}"]') @@ -382,6 +402,8 @@ for class_ in [cls for cls in classes.values() if cls.name in wanted_classes]: print(f'pub enum {class_.name} {{') for member in class_.members: type_ = types[member] + if type_.name != type_.non_camel_name: # little optimization for serde not to rename good types + print(f' #[serde(rename = "{type_.non_camel_name}")]') if len(type_.fields) == 0: print(f' #[doc="{type_.doc}"]') type_.exclude = True @@ -432,4 +454,4 @@ if not path.exists('everything.json'): classes={c.name: c.members for c in classes.values()}, types=[t.name for t in types.values()], methods=[m.name for m in methods.values()] - ), f, indent=4)
\ No newline at end of file + ), f, indent=4) |