mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-08-10 18:59:33 +00:00
Generate deserializers for requests
This commit is contained in:
@@ -11,7 +11,11 @@ from .serde.common import (
|
||||
to_class_name,
|
||||
to_method_name,
|
||||
)
|
||||
from .serde.deserialization import generate_read, param_value_fmt
|
||||
from .serde.deserialization import (
|
||||
function_deserializer_fmt,
|
||||
generate_read,
|
||||
param_value_fmt,
|
||||
)
|
||||
from .serde.serialization import generate_function, generate_write
|
||||
|
||||
|
||||
@@ -178,8 +182,10 @@ def generate(fs: FakeFs, tl: ParsedTl) -> None:
|
||||
)
|
||||
|
||||
writer = fs.open(Path("layer.py"))
|
||||
writer.write(f"from . import types")
|
||||
writer.write(f"from .core import Serializable, Reader")
|
||||
writer.write(f"from . import abcs, types")
|
||||
writer.write(
|
||||
f"from .core import Serializable, Reader, deserialize_bool, deserialize_i32_list, deserialize_i64_list, deserialize_identity, single_deserializer, list_deserializer"
|
||||
)
|
||||
writer.write(f"from typing import cast, Tuple, Type")
|
||||
writer.write(f"LAYER = {tl.layer!r}")
|
||||
writer.write(
|
||||
@@ -188,4 +194,10 @@ def generate(fs: FakeFs, tl: ParsedTl) -> None:
|
||||
for name in sorted(generated_type_names):
|
||||
writer.write(f" types.{name},")
|
||||
writer.write("))}")
|
||||
writer.write(f"__all__ = ['LAYER', 'TYPE_MAPPING']")
|
||||
writer.write("RESPONSE_MAPPING = {")
|
||||
for functiondef in tl.functiondefs:
|
||||
writer.write(
|
||||
f" {hex(functiondef.id)}: {function_deserializer_fmt(functiondef)},"
|
||||
)
|
||||
writer.write("}")
|
||||
writer.write(f"__all__ = ['LAYER', 'TYPE_MAPPING', 'RESPONSE_MAPPING']")
|
||||
|
@@ -122,3 +122,43 @@ def param_value_fmt(param: Parameter) -> str:
|
||||
return f"_{param.name} == 0x997275b5"
|
||||
else:
|
||||
return f"_{param.name}"
|
||||
|
||||
|
||||
def function_deserializer_fmt(defn: Definition) -> str:
|
||||
if defn.ty.generic_arg:
|
||||
if defn.ty.name != ("Vector"):
|
||||
raise NotImplementedError(
|
||||
"generic_arg return for non-boxed-vectors not implemented"
|
||||
)
|
||||
elif defn.ty.generic_ref:
|
||||
raise NotImplementedError(
|
||||
"return for generic refs inside vector not implemented"
|
||||
)
|
||||
elif is_trivial(NormalParameter(ty=defn.ty.generic_arg, flag=None)):
|
||||
if defn.ty.generic_arg.name == "int":
|
||||
return "deserialize_i32_list"
|
||||
elif defn.ty.generic_arg.name == "long":
|
||||
return "deserialize_i64_list"
|
||||
else:
|
||||
raise NotImplementedError(
|
||||
f"return for trivial arg {defn.ty.generic_arg} not implemented"
|
||||
)
|
||||
elif defn.ty.generic_arg.bare:
|
||||
raise NotImplementedError(
|
||||
"return for non-boxed serializables inside a vector not implemented"
|
||||
)
|
||||
else:
|
||||
return f"list_deserializer({inner_type_fmt(defn.ty.generic_arg)})"
|
||||
elif defn.ty.generic_ref:
|
||||
return "deserialize_identity"
|
||||
elif is_trivial(NormalParameter(ty=defn.ty, flag=None)):
|
||||
if defn.ty.name == "Bool":
|
||||
return "deserialize_bool"
|
||||
else:
|
||||
raise NotImplementedError(
|
||||
f"return for trivial arg {defn.ty} not implemented"
|
||||
)
|
||||
elif defn.ty.bare:
|
||||
raise NotImplementedError("return for non-boxed serializables not implemented")
|
||||
else:
|
||||
return f"single_deserializer({inner_type_fmt(defn.ty)})"
|
||||
|
Reference in New Issue
Block a user