Implement generated packet wire codecs (#47)
This commit is contained in:
@@ -38,6 +38,7 @@ TARGETS = {
|
||||
# implementations. The generated module keeps catalog markers and re-exports
|
||||
# the hand-written type so coverage remains deterministic.
|
||||
NATIVE_TYPES = {
|
||||
"T:LibreMetaverse.BitPack": "crate::bit_pack::BitPack",
|
||||
"T:LibreMetaverse.Packets.PacketType": "crate::packet_catalog::PacketType",
|
||||
"T:LibreMetaverse.PrimMesher.Coord": "crate::prim_mesher::Coord",
|
||||
"T:LibreMetaverse.PrimMesher.Face": "crate::prim_mesher::Face",
|
||||
@@ -296,6 +297,52 @@ COMPOSED_BASE_TYPES = {
|
||||
"T:LibreMetaverse.Packets.TestMessagePacket",
|
||||
"T:LibreMetaverse.Rendering.Joint",
|
||||
}
|
||||
|
||||
NATIVE_MESSAGE_CODEC_TYPES = {
|
||||
"T:LibreMetaverse.Messages.Linden.AgentGroupDataUpdateMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData",
|
||||
"T:LibreMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.NewGroupData",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionAcceptInvitation",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestBlock",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestStartConference",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatterBoxInvitationMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatterboxSessionEventReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.CopyInventoryFromNotecardMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.DirLandReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.DirLandReplyMessage.QueryReply",
|
||||
"T:LibreMetaverse.Messages.Linden.EnableSimulatorMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.EnableSimulatorMessage.SimulatorInfoBlock",
|
||||
"T:LibreMetaverse.Messages.Linden.EstablishAgentCommunicationMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.LandStatReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.LandStatReplyMessage.ReportDataBlock",
|
||||
"T:LibreMetaverse.Messages.Linden.MapLayerMessageBase",
|
||||
"T:LibreMetaverse.Messages.Linden.MapLayerReplyVariant",
|
||||
"T:LibreMetaverse.Messages.Linden.MapLayerReplyVariant.LayerData",
|
||||
"T:LibreMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner",
|
||||
"T:LibreMetaverse.Messages.Linden.ParcelPropertiesMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ParcelVoiceInfoRequestMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.PlacesReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.PlacesReplyMessage.QueryData",
|
||||
"T:LibreMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.RemoteParcelRequestReply",
|
||||
"T:LibreMetaverse.Messages.Linden.RequiredVoiceVersionMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ScriptRunningReplyMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.SendPostcardMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.TeleportFailedMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.TeleportFinishMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.UpdateAgentInformationMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.UpdateAgentInventoryRequestMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.UpdateAgentLanguageMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.UpdateScriptAgentRequestMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage",
|
||||
"T:LibreMetaverse.Messages.Linden.ViewerStatsMessage",
|
||||
}
|
||||
OPEN_ENUM_IDS = {"T:LibreMetaverse.BakeType", "T:LibreMetaverse.HoleType"}
|
||||
TRAIT_SUPERTRAITS = {
|
||||
"T:LibreMetaverse.IBakingTextureProvider": "std::any::Any",
|
||||
@@ -746,10 +793,68 @@ def native_member_body(member_id: str) -> str | None:
|
||||
body = NATIVE_MEMBER_BODIES.get(member_id)
|
||||
if body is not None:
|
||||
return body
|
||||
message_owner = "T:" + member_id[2:].split(".#ctor", 1)[0] if member_id.startswith("M:") and ".#ctor" in member_id else None
|
||||
if message_owner in NATIVE_MESSAGE_CODEC_TYPES:
|
||||
return "Ok(<Self as crate::message_codec::GeneratedMessage>::new_generated())"
|
||||
message_owner = "T:" + member_id[2:].rsplit(".Deserialize", 1)[0] if member_id.startswith("M:") and ".Deserialize(" in member_id else None
|
||||
if message_owner in NATIVE_MESSAGE_CODEC_TYPES:
|
||||
return "<Self as crate::message_codec::GeneratedMessage>::deserialize_generated(self, &map)"
|
||||
message_owner = "T:" + member_id[2:].rsplit(".Serialize", 1)[0] if member_id.startswith("M:") and member_id.endswith(".Serialize") else None
|
||||
if message_owner in NATIVE_MESSAGE_CODEC_TYPES:
|
||||
return "<Self as crate::message_codec::GeneratedMessage>::serialize_generated(self)"
|
||||
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.#ctor", member_id):
|
||||
return "Ok(<Self as crate::packet_catalog::GeneratedPacket>::new_generated())"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.#ctor\(LibreMetaverse\.Packets\.Header,System\.Byte\[\],System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::new_from_header(head, &bytes, i)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.#ctor\(System\.Byte\[\],System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::new_from_bytes(&bytes, i)"
|
||||
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.#ctor", member_id):
|
||||
return "Ok(<Self as crate::packet_catalog::GeneratedBlock>::new_generated())"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.#ctor\(System\.Byte\[\],System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedBlock>::new_from_bytes(&bytes, i)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.FromBytes\(System\.Byte\[\],System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedBlock>::decode_from_bytes(self, &bytes, i)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.ToBytes\(System\.Byte\[\],System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedBlock>::encode_to_slice(self, bytes, i)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.FromBytes\(LibreMetaverse\.Packets\.Header,System\.Byte\[\],System\.Int32@,System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::decode_from_header(self, header, &bytes, i, packet_end)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.FromBytes\(System\.Byte\[\],System\.Int32@,System\.Int32@,System\.Byte\[\]\)",
|
||||
member_id,
|
||||
):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::decode_from_bytes(self, &bytes, i, packet_end, zero_buffer)"
|
||||
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytes", member_id):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::encode_packet(self)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytes\(LibreMetaverse\.Interfaces\.IByteBufferPool,System\.Int32@\)",
|
||||
member_id,
|
||||
):
|
||||
return "{ let _ = pool; let bytes = <Self as crate::packet_catalog::GeneratedPacket>::encode_packet(self)?; *size = i32::try_from(bytes.len()).map_err(|_| crate::Error::Argument)?; Ok(bytes) }"
|
||||
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytesMultiple", member_id):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::encode_multiple(self)"
|
||||
if re.fullmatch(
|
||||
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytesMultiple\(LibreMetaverse\.Interfaces\.IByteBufferPool,System\.Int32\[\]@\)",
|
||||
member_id,
|
||||
):
|
||||
return "{ let _ = pool; let packets = <Self as crate::packet_catalog::GeneratedPacket>::encode_multiple(self)?; *sizes = packets.iter().map(|packet| i32::try_from(packet.len()).unwrap_or(i32::MAX)).collect(); Ok(packets) }"
|
||||
if re.fullmatch(r"P:LibreMetaverse\.Packets\.[^.]+Packet\.Length", member_id):
|
||||
return "<Self as crate::packet_catalog::GeneratedPacket>::generated_length(self)"
|
||||
if re.fullmatch(r"P:LibreMetaverse\.Packets\.[^.]+Packet\.UsesBufferPooling", member_id):
|
||||
@@ -760,6 +865,20 @@ def native_member_body(member_id: str) -> str | None:
|
||||
return "Ok(crate::packet_catalog::packet_type(id, frequency))"
|
||||
if member_id == "M:LibreMetaverse.Packets.Packet.BuildPacket(LibreMetaverse.Packets.PacketType)":
|
||||
return "crate::packet_catalog::build_packet(type_)"
|
||||
if member_id == "M:LibreMetaverse.Packets.Packet.BuildPacket(System.Byte[],System.Int32@,System.Byte[])":
|
||||
return "{ let mut zero_buffer = zero_buffer; crate::packet_wire::build_packet_from_bytes(&packet_buffer, packet_end, &mut zero_buffer) }"
|
||||
if member_id == "M:LibreMetaverse.Packets.Header.BuildHeader(System.Byte[],System.Int32@,System.Int32@)":
|
||||
return "crate::packet_wire::decode_header(&bytes, pos, packet_end)"
|
||||
if member_id == "M:LibreMetaverse.Packets.Header.FromBytes(System.Byte[],System.Int32@,System.Int32@)":
|
||||
return "{ *self = crate::packet_wire::decode_header(&bytes, pos, packet_end)?; Ok(()) }"
|
||||
if member_id == "M:LibreMetaverse.Packets.Header.ToBytes(System.Byte[],System.Int32@)":
|
||||
return "crate::packet_wire::header_to_slice(self, bytes, i)"
|
||||
if member_id == "M:LibreMetaverse.Packets.Header.AcksToBytes(System.Byte[],System.Int32@)":
|
||||
return "crate::packet_wire::acks_to_slice(self, bytes, i)"
|
||||
if member_id == "M:LibreMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])":
|
||||
return "crate::packet_wire::zero_decode(src, srclen, dest)"
|
||||
if member_id == "M:LibreMetaverse.Helpers.ZeroEncode(System.Byte[],System.Int32,System.Byte[])":
|
||||
return "crate::packet_wire::zero_encode(src, srclen, dest)"
|
||||
return None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user