Finish poc snap item generation

This commit is contained in:
ChillerDragon 2023-05-14 12:18:29 +02:00
parent 211f470e7b
commit 7684002a64

View file

@ -49,6 +49,12 @@ class ArrayMemberTypeJson(TypedDict):
# strings # strings
disallow_cc: bool disallow_cc: bool
# array in array only for de client info
# type forward declaration or self reference is not supported
# so hack it with a string
member_type: 'ArrayMemberTypeJson'
count: int
class NetConnlessMemberTypeJson(TypedDict): class NetConnlessMemberTypeJson(TypedDict):
kind: KINDCONLESS kind: KINDCONLESS
@ -295,6 +301,20 @@ def gen_unpack_members(msg: NetMessageJson) -> str:
unpacker = 'int() == 1' unpacker = 'int() == 1'
elif arr_member['kind'] in ('int32', 'tick'): elif arr_member['kind'] in ('int32', 'tick'):
unpacker = 'int()' unpacker = 'int()'
elif arr_member['kind'] == 'array':
sub_size: int = arr_member['count']
sub_arr_member = arr_member['member_type']
unpacker = 'int()'
if sub_arr_member['kind'] == 'int32':
name = name_to_snake(member["name"])
res += f' for i in range(0, {size}):\n'
res += f' sub: list[int] = []\n'
res += f' for k in range(0, {sub_size}):\n'
res += f' sub[k] = unpacker.get_{unpacker}\n'
res += f' self.{name}[i] = sub\n'
continue
else:
raise ValueError(f"Error: unknown sub array member type {member['type']}")
else: else:
raise ValueError(f"Error: unknown array member type {member['type']}") raise ValueError(f"Error: unknown array member type {member['type']}")
name = name_to_snake(member["name"]) name = name_to_snake(member["name"])
@ -350,9 +370,11 @@ def get_dependencies_connless7(msg: NetConnlessJson) -> str:
', '.join(sorted(set(typing_deps))) + '\n' ', '.join(sorted(set(typing_deps))) + '\n'
return res return res
def get_dependencies(msg: NetMessageJson) -> str: def get_dependencies(msg: NetMessageJson, typing_dep: Optional[str] = 'Literal') -> str:
packer_deps: list[str] = [] packer_deps: list[str] = []
typing_deps: list[str] = ['Literal'] typing_deps: list[str] = []
if typing_dep:
typing_deps.append(typing_dep)
need_enums: bool = False need_enums: bool = False
for member in msg['members']: for member in msg['members']:
if member['type']['kind'] == 'string': if member['type']['kind'] == 'string':
@ -396,6 +418,11 @@ def get_dependencies(msg: NetMessageJson) -> str:
packer_deps.append('pack_int') packer_deps.append('pack_int')
elif arr_member['kind'] in ('int32', 'tick'): elif arr_member['kind'] in ('int32', 'tick'):
packer_deps.append('pack_int') packer_deps.append('pack_int')
elif arr_member['kind'] == 'array':
if arr_member['member_type']['kind'] == 'int32':
packer_deps.append('pack_int')
else:
raise ValueError(f"Error: unknown sub array member type {member['type']}")
else: else:
raise ValueError(f"Error: unknown array member type {member['type']}") raise ValueError(f"Error: unknown array member type {member['type']}")
elif member['type']['kind'] == 'flags': # TODO: think about flags elif member['type']['kind'] == 'flags': # TODO: think about flags
@ -457,6 +484,12 @@ def pack_field(member: NetMessageMemberJson) -> str:
packer = 'int' packer = 'int'
elif arr_member['kind'] in ('int32', 'tick'): elif arr_member['kind'] in ('int32', 'tick'):
packer = 'int' packer = 'int'
elif arr_member['kind'] == 'array':
sub_arr_member = arr_member['member_type']
if sub_arr_member['kind'] == 'int32':
return f"b''.join([b''.join([pack_{packer}(x) for x in sub]) for sub in {field}])"
else:
raise ValueError(f"Error: unknown sub array member type {member['type']}")
else: else:
raise ValueError(f"Error: unknown array member type {member['type']}") raise ValueError(f"Error: unknown array member type {member['type']}")
return f"b''.join([pack_{packer}(x) for x in {field}])" return f"b''.join([pack_{packer}(x) for x in {field}])"
@ -664,7 +697,7 @@ class CodeGenerator():
else: else:
raise ValueError( \ raise ValueError( \
f"Error: msg {name_to_snake(member['name'])} " \ f"Error: msg {name_to_snake(member['name'])} " \
f"has unknown array sub member type {arr_member['type']}") f"has unknown array sub member type {member['type']}")
else: else:
raise ValueError( \ raise ValueError( \
f"Error: msg {name_to_snake(member['name'])} " \ f"Error: msg {name_to_snake(member['name'])} " \
@ -751,6 +784,10 @@ class CodeGenerator():
out_file.write('# generated by scripts/generate_messages.py\n') out_file.write('# generated by scripts/generate_messages.py\n')
out_file.write('\n') out_file.write('\n')
out_file.write('from twnet_parser.pretty_print import PrettyPrint\n') out_file.write('from twnet_parser.pretty_print import PrettyPrint\n')
if len(obj['members']) > 0:
out_file.write('from twnet_parser.packer import Unpacker\n')
out_file.write(get_dependencies(obj, None))
out_file.write('\n')
out_file.write(f'class Obj{name_camel}(PrettyPrint):\n') out_file.write(f'class Obj{name_camel}(PrettyPrint):\n')
comma: str = '' comma: str = ''
if len(obj['members']) > 0: if len(obj['members']) > 0:
@ -771,6 +808,17 @@ class CodeGenerator():
out_file.write('\n') out_file.write('\n')
self.generate_field_assignments_in_initialize(obj, out_file) self.generate_field_assignments_in_initialize(obj, out_file)
out_file.write('\n') out_file.write('\n')
out_file.write(' # first byte of data\n')
out_file.write(' # has to be the first byte of the message payload\n')
out_file.write(' # NOT the chunk header and NOT the message id\n')
out_file.write(' def unpack(self, data: bytes) -> bool:\n')
if len(obj['members']) > 0:
out_file.write(' unpacker = Unpacker(data)\n')
out_file.write(gen_unpack_members(obj))
out_file.write(' return True\n')
out_file.write('\n')
out_file.write(' def pack(self) -> bytes:\n')
out_file.write(gen_pack_return(obj))
def generate_msg_connless( def generate_msg_connless(
self, self,