Fixed JSON encoding and decoding for lists, added empty() method

The new empty() method retrieves an empty instance of the
given object, with all the attributes set to None
This commit is contained in:
Lonami 2016-09-25 10:50:48 +02:00
parent fddb3e9aac
commit b68772aab5
2 changed files with 25 additions and 15 deletions

View File

@ -117,14 +117,8 @@ class BinaryReader:
# If there was still no luck, give up
raise TypeNotFoundError(constructor_id)
# Now we need to determine the number of parameters of the class, so we can
# instantiate it with all of them set to None, and still, no need to write
# the default =None in all the classes, thus forcing the user to provide a real value
sig = inspect.signature(clazz.__init__)
params = [None] * (len(sig.parameters) - 1) # Subtract 1 (self)
result = clazz(*params) # https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists
# Finally, read the object and return the result
# Create an empty instance of the class, and read its values
result = clazz.empty()
result.on_response(self)
return result

View File

@ -133,6 +133,17 @@ class TLGenerator:
TLGenerator.write_onsend_code(builder, arg, tlobject.args)
builder.end_block()
# Generate the empty() function, which returns an "empty"
# instance, in which all attributes are set to None
builder.writeln('@staticmethod')
builder.writeln('def empty():')
builder.writeln('"""Returns an "empty" instance (all attributes are None)"""')
builder.writeln('return {}({})'.format(
TLGenerator.get_class_name(tlobject),
', '.join('None' for _ in range(len(args)))
))
builder.end_block()
# Write the on_response(self, reader) function
builder.writeln('def on_response(self, reader):')
# Do not read constructor's ID, since that's already been read somewhere else
@ -163,7 +174,11 @@ class TLGenerator:
for arg in args:
if TLGenerator.is_tlobject(arg.type):
builder.writeln("'{0}': self.{0}.json_encode(),".format(arg.name))
if arg.is_vector:
builder.writeln("'{0}': [{0}_item.json_encode() "
"for {0}_item in self.{0}],".format(arg.name))
else:
builder.writeln("'{0}': self.{0}.json_encode(),".format(arg.name))
else:
builder.writeln("'{0}': self.{0},".format(arg.name))
@ -175,16 +190,17 @@ class TLGenerator:
builder.writeln('@staticmethod')
builder.writeln('def json_decode(json_string):')
builder.writeln('# Create an empty instance which will be filled with the JSON values')
builder.writeln('instance = {}({})'.format(
TLGenerator.get_class_name(tlobject),
', '.join('None' for _ in range(len(args)))
))
builder.writeln('instance = {}.empty()'.format(TLGenerator.get_class_name(tlobject)))
builder.writeln('dictionary = json.loads(json_string)')
builder.writeln()
for arg in args:
if TLGenerator.is_tlobject(arg.type):
builder.writeln("instance.{0} = dictionary['{0}'].json_decode() if '{0}' in dictionary "
"and dictionary['{0}'] is not None else None".format(arg.name))
if arg.is_vector:
builder.writeln("instance.{0} = [{0}_item.json_decode() "
"for {0}_item in dictionary['{0}']]".format(arg.name))
else:
builder.writeln("instance.{0} = dictionary['{0}'].json_decode() if '{0}' in dictionary "
"and dictionary['{0}'] is not None else None".format(arg.name))
else:
builder.writeln("instance.{0} = dictionary.get('{0}', None)".format(arg.name))