def gen_store_code_for_field(f, msg, parent_struct_name): tmpl = "" if util.field_is_message(f) and util.field_is_repeated(f): tmpl = ( " output.{field}.length = input.{field}.length; \n" " for(uint i{i}=0; i{i}<input.{field}.length; i{i}++) {{ \n" " {lib}.store(input.{field}[i{i}], output.{field}[i{i}]); \n" " {map_insert_code}" " }}" ) elif util.field_is_message(f): tmpl = ( " {lib}.store(input.{field}, output.{field}); \n" ) else: return ( " output.{field} = input.{field}; \n" ).format( field = f.name, ) libname = util.gen_struct_codec_lib_name_from_field(f) return tmpl.format( i = f.number, field = f.name, lib = libname, map_insert_code = gen_map_insert_on_store(f, msg, parent_struct_name) )
def gen_value_copy_code(value_field, dst_flagment): if util.field_is_message(value_field): return ("{struct_name}.store(value, {dst}.value);").format( struct_name=util.gen_struct_codec_lib_name_from_field(value_field), dst=dst_flagment) else: return ("{dst}.value = value;").format(dst=dst_flagment)
def gen_field_scalar_size(f): wt = util.gen_wire_type(f) vt = util.field_pb_type(f) fname = f.name + ("[i]" if util.field_is_repeated(f) else "") if wt == "Varint": if vt == "bool": return "1" else: return ("_pb._sz_{valtype}(r.{field})").format( valtype=vt, field=fname, ) elif wt == "Fixed64": return "8" elif wt == "Fixed32": return "4" elif wt == "LengthDelim": if vt == "bytes": return ("_pb._sz_lendelim(r.{field}.length)").format(field=fname) elif vt == "string": return ("_pb._sz_lendelim(bytes(r.{field}).length)").format( field=fname) elif vt == "message": st = util.field_sol_type(f) if st is None: return ("_pb._sz_lendelim({lib}._estimate(r.{field}))").format( lib=util.gen_struct_codec_lib_name_from_field(f), field=fname, ) else: return "{}".format(util.gen_soltype_estimate_len(st)) else: return ("__does not support pb type {t}__").format(t=vt) else: return ("__does not support wire type {t}__").format(t=wt)
def gen_struct_decoder(f, msg, parent_struct_name): return ( " function {name}(uint p, bytes bs) \n" " internal pure returns ({struct}, uint) {{ \n" " (uint sz, uint bytesRead) = _pb._decode_varint(p, bs); \n" " p += bytesRead; \n" " ({decode_type} r,) = {lib}._decode(p, bs, sz); \n" " return (r, sz + bytesRead); \n" " }} \n").format( struct=util.gen_global_type_name_from_field(f), decode_type=util.gen_global_type_decl_from_field(f), name=util.gen_struct_decoder_name_from_field(f), lib=util.gen_struct_codec_lib_name_from_field(f))
def gen_field_scalar_size(f, msg, file): wt = util.gen_wire_type(f) vt = util.field_pb_type(f) fname = f.name + ("[i]" if util.field_is_repeated(f) else "") if wt == "Varint": if vt == "bool": return "1" if vt == "enum": type_name = util.gen_enum_name_from_field(f) library_name = "" if msg.name == type_name.split(".")[0] else ( type_name.split(".")[0] + ".") if library_name == ".": library_name = util.gen_global_enum_name(file) + library_name return ( "ProtoBufRuntime._sz_{valtype}({library_name}encode_{enum_name}(r.{field}))" ).format(valtype=vt, field=fname, enum_name=type_name.split(".")[-1], library_name=library_name) else: return ("ProtoBufRuntime._sz_{valtype}(r.{field})").format( valtype=vt, field=fname, ) elif wt == "Fixed64": return "8" elif wt == "Fixed32": return "4" elif wt == "LengthDelim": if vt == "bytes": return ("ProtoBufRuntime._sz_lendelim(r.{field}.length)").format( field=fname) elif vt == "string": return ("ProtoBufRuntime._sz_lendelim(bytes(r.{field}).length)" ).format(field=fname) elif vt == "message": st = util.field_sol_type(f) if st is None: return ( "ProtoBufRuntime._sz_lendelim({lib}._estimate(r.{field}))" ).format( lib=util.gen_struct_codec_lib_name_from_field(f), field=fname, ) else: return "{}".format(util.gen_soltype_estimate_len(st)) else: return ("__does not support pb type {t}__").format(t=vt) else: return ("__does not support wire type {t}__").format(t=wt)
def gen_store_code_for_field(f, msg, parent_struct_name): tmpl = "" if util.field_is_message(f) and util.field_is_repeated(f): tmpl = sol_constants.STORE_REPEATED elif util.field_is_message(f): tmpl = sol_constants.STORE_MESSAGE else: return (sol_constants.STORE_OTHER).format(field=f.name) libname = util.gen_struct_codec_lib_name_from_field(f) return tmpl.format(i=f.number, field=f.name, lib=libname, map_insert_code=gen_map_insert_on_store( f, msg, parent_struct_name))
def gen_struct_decoder(f, msg, parent_struct_name): return (decoder_constants.STRUCT_DECORDER).format( struct=util.gen_global_type_name_from_field(f), decode_type=util.gen_global_type_decl_from_field(f), name=util.gen_struct_decoder_name_from_field(f), lib=util.gen_struct_codec_lib_name_from_field(f))