summaryrefslogtreecommitdiffstats
path: root/src/client_ext/generate.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/client_ext/generate.py')
-rw-r--r--src/client_ext/generate.py68
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)