Translate appearance and outfit parity tests

This commit is contained in:
2026-08-08 20:29:15 +02:00
parent ffe559db61
commit a78f9fba76
21 changed files with 4111 additions and 1902 deletions

View File

@@ -73,7 +73,12 @@ WIRE_ROOT_TYPES = {
"T:LibreMetaverse.TreeDefinition",
}
COMPOSED_BASE_TYPES = {
"T:LibreMetaverse.InventoryAttachment",
"T:LibreMetaverse.InventoryFolder",
"T:LibreMetaverse.InventoryItem",
"T:LibreMetaverse.InventoryObject",
"T:LibreMetaverse.InventoryTexture",
"T:LibreMetaverse.InventoryWearable",
"T:LibreMetaverse.Messages.Linden.ChatSessionAcceptInvitation",
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate",
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestStartConference",
@@ -82,6 +87,11 @@ COMPOSED_BASE_TYPES = {
"T:LibreMetaverse.Packets.TestMessagePacket",
"T:LibreMetaverse.Rendering.Joint",
}
OPEN_ENUM_IDS = {"T:LibreMetaverse.BakeType"}
TRAIT_SUPERTRAITS = {
"T:LibreMetaverse.IBakingTextureProvider": "std::any::Any",
"T:LibreMetaverse.Appearance.ICurrentOutfitPolicy": "Send + Sync",
}
CORE_NAMESPACES = (
"LibreMetaverse.Http",
"LibreMetaverse.Stats",
@@ -476,6 +486,21 @@ def render_enum(item: dict, rust_name: str) -> list[str]:
underlying = UNDERLYING[item["enum_underlying_type"]]
values = [member for member in item["members"] if member["kind"] == "enum_value"]
lines = [f"/// C# type: `{item['doc_id']}`."]
if item["doc_id"] in OPEN_ENUM_IDS:
lines += [
"#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]",
"#[repr(transparent)]",
f"pub struct {rust_name}(pub {underlying});",
"#[allow(non_upper_case_globals)]",
f"impl {rust_name} {{",
]
for member in values:
lines += [
f" /// C# member: `{member['doc_id']}`.",
f" pub const {mapping.pascal(member['name'])}: Self = Self({member['value']['value']});",
]
lines.append("}")
return lines
if flags_enum(item) or duplicate_enum_values(item):
lines += [
"#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]",
@@ -508,7 +533,7 @@ def render_body(signature: str, member_id: str, error_model: str, asyncness: str
if error_model.startswith("Result")
else f"libremetaverse_types::unimplemented_api!({json.dumps(member_id)})"
)
if asyncness == "boxed_future":
if asyncness == "boxed_future" or "std::pin::Pin<Box<dyn std::future::Future" in signature:
failure = f"Box::pin(async {{ {failure} }})"
return f" {signature} {{ {failure} }}"
@@ -535,7 +560,9 @@ def render_type(item: dict, type_row: dict, member_rows: dict[str, dict[str, str
trait = item["kind"] == "interface"
lines = [f"/// C# type: `{item['doc_id']}`."]
if trait:
lines.append(f"pub trait {rust_name}{suffix} {{")
supertrait = TRAIT_SUPERTRAITS.get(item["doc_id"])
inheritance = f": {supertrait}" if supertrait else ""
lines.append(f"pub trait {rust_name}{suffix}{inheritance} {{")
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"], [])