Translate wire semantics tests
This commit is contained in:
@@ -72,6 +72,14 @@ WIRE_ROOT_TYPES = {
|
||||
"T:LibreMetaverse.Tree",
|
||||
"T:LibreMetaverse.TreeDefinition",
|
||||
}
|
||||
COMPOSED_BASE_TYPES = {
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionAcceptInvitation",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate",
|
||||
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestStartConference",
|
||||
"T:LibreMetaverse.Messages.Linden.MapLayerReplyVariant",
|
||||
"T:LibreMetaverse.Packets.DirPlacesReplyPacket",
|
||||
"T:LibreMetaverse.Packets.TestMessagePacket",
|
||||
}
|
||||
CORE_NAMESPACES = (
|
||||
"LibreMetaverse.Http",
|
||||
"LibreMetaverse.Stats",
|
||||
@@ -529,6 +537,7 @@ def render_type(item: dict, type_row: dict, member_rows: dict[str, dict[str, str
|
||||
else:
|
||||
fields = [member for member in item["members"] if member["kind"] == "field" and not member.get("static")]
|
||||
private_fields = PRIVATE_LAYOUTS.get(item["doc_id"], [])
|
||||
base_type = item.get("base_type") if item["doc_id"] in COMPOSED_BASE_TYPES else None
|
||||
if derives := VALUE_DERIVES.get(item["doc_id"]):
|
||||
lines.append(f"#[derive({derives})]")
|
||||
if item["doc_id"] == "T:LibreMetaverse.StructuredData.OSD":
|
||||
@@ -541,10 +550,15 @@ def render_type(item: dict, type_row: dict, member_rows: dict[str, dict[str, str
|
||||
" Array(Vec<OSD>), Map(std::collections::HashMap<String, OSD>), LlsdXml(String),",
|
||||
"}",
|
||||
]
|
||||
elif not fields and not names and not private_fields:
|
||||
elif not fields and not names and not private_fields and not base_type:
|
||||
lines.append(f"pub struct {rust_name};")
|
||||
else:
|
||||
lines.append(f"pub struct {rust_name}{suffix} {{")
|
||||
if base_type:
|
||||
lines += [
|
||||
f" /// Rust composition for C# base type `{base_type}`.",
|
||||
f" pub base: {mapper.type(base_type, None, set(names))},",
|
||||
]
|
||||
for field in fields:
|
||||
field_signature = member_rows[field["doc_id"]]["rust_signature"]
|
||||
field_name_match = re.fullmatch(r"pub ([^:]+): (.+)", field_signature)
|
||||
|
||||
@@ -170,6 +170,24 @@ SUPPORT_TYPES = {
|
||||
MEMBER_RETURN_OVERRIDES = {
|
||||
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
|
||||
}
|
||||
MEMBER_SIGNATURE_OVERRIDES = {
|
||||
"M:LibreMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])": (
|
||||
"pub fn zero_decode(src: Option<&[u8]>, srclen: i32, dest: Option<&mut [u8]>) "
|
||||
"-> Result<i32, crate::Error>",
|
||||
"shared_borrow,owned,mutable_borrow",
|
||||
),
|
||||
"M:LibreMetaverse.Helpers.ZeroEncode(System.Byte[],System.Int32,System.Byte[])": (
|
||||
"pub fn zero_encode(src: Option<&[u8]>, srclen: i32, dest: Option<&mut [u8]>) "
|
||||
"-> Result<i32, crate::Error>",
|
||||
"shared_borrow,owned,mutable_borrow",
|
||||
),
|
||||
"M:LibreMetaverse.Packets.InventoryDescendentsPacket.FromBytes(System.Byte[],System.Int32@,System.Int32@,System.Byte[])": (
|
||||
"pub fn from_bytes_with_bytes_int32_int32_bytes(&mut self, bytes: Vec<u8>, "
|
||||
"i: &mut i32, packet_end: &mut i32, zero_buffer: Option<&mut [u8]>) "
|
||||
"-> Result<(), crate::Error>",
|
||||
"mutable_self,owned,mutable_borrow,mutable_borrow,optional_mutable_borrow",
|
||||
),
|
||||
}
|
||||
TYPE_USAGE_OVERRIDES = {
|
||||
"LibreMetaverse.DictionaryChangeCallback": (
|
||||
"std::sync::Arc<dyn Fn(libremetaverse::DictionaryEventAction, "
|
||||
@@ -566,6 +584,15 @@ def generic_names(item: dict, owner: dict) -> set[str]:
|
||||
def method_receiver(owner: dict, item: dict) -> tuple[str, str]:
|
||||
if item.get("static") or item["kind"] == "constructor":
|
||||
return "", "none"
|
||||
if item["name"] == "Deserialize":
|
||||
return "&mut self", "mutable_self"
|
||||
if owner["doc_id"] == "T:LibreMetaverse.BitPack" and item["name"].startswith(("Pack", "Unpack")):
|
||||
return "&mut self", "mutable_self"
|
||||
if (
|
||||
owner["doc_id"] == "T:LibreMetaverse.Packets.InventoryDescendentsPacket"
|
||||
and item["name"].startswith("FromBytes")
|
||||
):
|
||||
return "&mut self", "mutable_self"
|
||||
observers = ("Get", "TryGet", "Find", "Contains", "Has", "Is", "Can", "To", "Equals", "Compare")
|
||||
if owner["kind"] == "struct" and not item["name"].startswith(observers) and not item["name"].startswith("op_"):
|
||||
return "&mut self", "mutable_self"
|
||||
@@ -615,6 +642,9 @@ def parameter_slug(value: str) -> str:
|
||||
|
||||
|
||||
def member_signature(mapper: Mapper, owner: dict, item: dict, rust_name: str) -> tuple[str, str, str, str, str]:
|
||||
if item["doc_id"] in MEMBER_SIGNATURE_OVERRIDES:
|
||||
signature, ownership = MEMBER_SIGNATURE_OVERRIDES[item["doc_id"]]
|
||||
return signature, ownership, "sync", "Result<_, crate::Error>", "method"
|
||||
generics = generic_names(item, owner)
|
||||
mapped_parameters = [map_parameter(mapper, parameter, generics) for parameter in item.get("parameters", [])]
|
||||
own = [value[0] for value in mapped_parameters]
|
||||
|
||||
Reference in New Issue
Block a user