FeatherMC/src/protocol/generate_protocol.py

91 lines
2.8 KiB
Python
Raw Normal View History

2020-08-01 22:53:12 +01:00
import hjson
2020-08-02 02:44:35 +01:00
import sys
2020-08-01 22:53:12 +01:00
text = ''
def add_text(fmt, *args):
global text
text += (fmt + '\n').format(*args)
def resolve_type(aliases, type):
if type in aliases:
return aliases[type]
return type
def print_states(states):
add_text(' enum class ProtocolState : int32_t')
add_text(' {{')
for state, value in states.items():
add_text(' {} = {},', state, value)
add_text(' }};')
def get_rw_func(primitiveType, aliasedType, read):
prefix = 'Read' if read else 'Write'
if aliasedType == 'varint':
2020-08-02 02:44:35 +01:00
if primitiveType == 'int32_t':
return '{}VarInt'.format(prefix)
else:
return '{}VarInt<{}>'.format(prefix, primitiveType)
2020-08-01 22:53:12 +01:00
elif aliasedType == 'string':
return '{}String'.format(prefix)
else:
return 'Read<{}>'.format(aliasedType)
def print_messages(list, aliases, primitives, serverbound):
global text
for message_name, message in list.items():
add_text(' struct {}Message', message_name)
add_text(' {{')
add_text(' static constexpr int32_t PacketId = {};', message['id'])
add_text(' static constexpr bool ServerBound = {};', 'true' if serverbound else 'false')
add_text(' static constexpr ProtocolState PacketState = ProtocolState::{};', message['state'])
add_text('')
if serverbound:
add_text(' {}Message(PacketReader& reader)', message_name)
add_text(' {{')
for name, type in message['vars'].items():
add_text(' {} = reader.{}();', name, get_rw_func(resolve_type(primitives, type), resolve_type(aliases, type), True))
add_text(' }}')
add_text('')
for name, type in message['vars'].items():
add_text(' {} {};', resolve_type(primitives, type), name)
add_text(' }};')
2020-08-02 02:44:35 +01:00
add_text('')
2020-08-01 22:53:12 +01:00
def print_protocol():
2020-08-02 02:44:35 +01:00
with open(sys.argv[1]) as message_file:
2020-08-01 22:53:12 +01:00
message_scheme = hjson.load(message_file)
print_states(message_scheme['states'])
add_text('')
print_messages(
message_scheme['messages']['serverbound'],
message_scheme['types']['aliases'],
message_scheme['types']['primitives'],
True)
2020-08-02 02:44:35 +01:00
def main():
if len(sys.argv) != 3:
print('Usage: generate_protocol.py <input: protocol.hjson> <output: ProtocolDefinitions.h>')
2020-08-02 02:44:35 +01:00
return
add_text('#pragma once')
add_text('')
add_text('#include <cstdint>')
add_text('#include "PacketReader.h"')
add_text('')
add_text('namespace Feather')
add_text('{{')
print_protocol()
add_text('}}')
add_text('')
with open(sys.argv[2], 'w') as out_file:
2020-08-02 02:44:35 +01:00
out_file.write(text)
out_file.close()
2020-08-01 22:53:12 +01:00
2020-08-02 02:44:35 +01:00
main()