Generate extension API shims

This commit is contained in:
2026-08-08 12:58:50 +02:00
parent 1291234e6f
commit 643762fd1d
19 changed files with 12766 additions and 1312 deletions

View File

@@ -9,10 +9,10 @@ projects, public C# type names have Rust declarations, every upstream NUnit case
has a traceable placeholder, and every sample/tool project has a Rust binary
target. Types, StructuredData, Imaging, PrimMesher, both rendering adapters, and
the main assembly's packet/message/asset/primitive wire-data, core
runtime/networking, avatar-facing manager, and world/social/service manager
slices now have complete callable, failure-only signatures; the remaining
extension slices plus semantic Rust test translations are still required before
the public API shim is complete.
runtime/networking, avatar-facing manager, world/social/service manager, RLV,
LSL tools, Utilities, Vivox, and WebRTC slices now have complete callable,
failure-only signatures. The downstream 100% coverage audit and semantic Rust
test translations are still required before Stage 0 is complete.
The source snapshot, compatibility rules, dependency research, and ordered
implementation plan are in [RUSTREWRITE.md](RUSTREWRITE.md).

View File

@@ -53,21 +53,21 @@ The current workspace is a structural baseline, not a working client:
resolved to cross-platform Rust or project-owned boundary types;
- the completed Types, StructuredData, Imaging, PrimMesher, rendering, main
wire/data, core runtime/networking, avatar-facing manager, and
world/social/service manager slices expose 2,795 final Rust-facing types and
all 28,768 callable members with real fields/constants/enum values and
standardized failing bodies;
world/social/service manager, RLV, LSL tools, Utilities, Vivox, and WebRTC
slices expose all 3,066 final Rust-facing types and all 30,789 callable
members with real fields/constants/enum values and standardized failing
bodies;
- all 1,295 NUnit `[Test]`/`[TestCase]` invocations have compiling Rust test
entries that intentionally panic with their source identity and body hash;
- all nine sample/tool projects have compiling Rust binary targets;
- the 128 TestClient command source files are retained as a command inventory.
The remaining 271 generated type shims preserve names and module placement, but
do not yet expose their 2,021 callable members. `api/SURFACE.tsv` is an inventory aid,
not proof of API coverage: it records declaration lines but does not fully parse
multiline signatures. Likewise, a generated `pending` test is a parity
placeholder, not a semantic translation. **This repository is therefore at
Stage 0 and does not yet satisfy either the full API-shim gate or the full
test-suite gate.**
No generated type shells remain pending: all cataloged members are callable.
`api/SURFACE.tsv` is still an inventory aid, not proof of API coverage: it
records declaration lines but does not fully parse multiline signatures.
Likewise, a generated `pending` test is a parity placeholder, not a semantic
translation. **This repository is therefore at Stage 0 and still requires the
independent downstream API audit and full test-suite gate.**
The avatar-facing slice preserves the C# agent, movement/camera, appearance and
outfit-policy, inventory/AIS/store, asset/cache, avatar, and animesh concepts.
@@ -82,6 +82,13 @@ explicit cancellation and shared typed failures; request/reply events expose
typed payloads and subscription guards, while catalog constants and flag values
remain real.
The extension slice preserves the C# RLV restrictions, callbacks and services;
LSL lexer/parser/generator and diagnostic types; Utilities helpers; Vivox
protocol/session/manager types; and WebRTC signaling/device/session concepts.
Blocking compatibility surfaces stay explicit, stored callbacks and events use
typed ownership, and parser/voice bodies fail before performing parsing,
networking, device access, or proprietary/native work.
No functional porting starts until both missing gates are complete across the
entire workspace, rather than one crate at a time:

View File

@@ -1079,7 +1079,7 @@ F:LibreMetaverse.Bumpiness.Weave enum_value LibreMetaverse.Bumpiness LibreMetave
F:LibreMetaverse.Bumpiness.Woodgrain enum_value LibreMetaverse.Bumpiness LibreMetaverse.Bumpiness.Woodgrain libremetaverse libremetaverse::Bumpiness::Woodgrain Woodgrain: libremetaverse::Bumpiness owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.CRC32.CRC field System.UInt32 LibreMetaverse.CRC32.CRC libremetaverse-types libremetaverse_types::CRC32::crc pub crc: u32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Caps.AllCapabilities field LibreMetaverse.StructuredData.OSDArray LibreMetaverse.Caps.AllCapabilities libremetaverse libremetaverse::Caps::all_capabilities pub fn all_capabilities() -> libremetaverse_structured_data::OSDArray none sync infallible_placeholder direct_snake_case static_field_accessor mapped
F:LibreMetaverse.Caps.Simulator field LibreMetaverse.Simulator LibreMetaverse.Caps.Simulator libremetaverse libremetaverse::Caps::simulator pub simulator: libremetaverse::Simulator owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Caps.Simulator field LibreMetaverse.Simulator LibreMetaverse.Caps.Simulator libremetaverse libremetaverse::Caps::simulator pub simulator: Box<libremetaverse::Simulator> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.CapsCategory.AssetFetch enum_value LibreMetaverse.CapsCategory LibreMetaverse.CapsCategory.AssetFetch libremetaverse libremetaverse::CapsCategory::AssetFetch AssetFetch: libremetaverse::CapsCategory owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.CapsCategory.AssetUpload enum_value LibreMetaverse.CapsCategory LibreMetaverse.CapsCategory.AssetUpload libremetaverse libremetaverse::CapsCategory::AssetUpload AssetUpload: libremetaverse::CapsCategory owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.CapsCategory.Default enum_value LibreMetaverse.CapsCategory LibreMetaverse.CapsCategory.Default libremetaverse libremetaverse::CapsCategory::Default Default: libremetaverse::CapsCategory owned_value sync none direct_snake_case direct mapped
@@ -2916,20 +2916,20 @@ F:LibreMetaverse.LslTools.CSymbol.m_emitted field System.Boolean LibreMetaverse.
F:LibreMetaverse.LslTools.CSymbol.m_first field LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.CSymbol.m_first libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_first pub m_first: libremetaverse_lsl_tools::SymbolSet owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_follow field LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.CSymbol.m_follow libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_follow pub m_follow: libremetaverse_lsl_tools::SymbolSet owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_initialisation field System.String LibreMetaverse.LslTools.CSymbol.m_initialisation libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_initialisation pub m_initialisation: String owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_parser field LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.CSymbol.m_parser libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_parser pub m_parser: libremetaverse_lsl_tools::SymbolsGen owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_parser field LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.CSymbol.m_parser libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_parser pub m_parser: Box<libremetaverse_lsl_tools::SymbolsGen> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_prec field LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.CSymbol.m_prec libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_prec pub m_prec: libremetaverse_lsl_tools::Precedence owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_prod field LibreMetaverse.LslTools.Production LibreMetaverse.LslTools.CSymbol.m_prod libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_prod pub m_prod: libremetaverse_lsl_tools::Production owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_prod field LibreMetaverse.LslTools.Production LibreMetaverse.LslTools.CSymbol.m_prod libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_prod pub m_prod: Box<libremetaverse_lsl_tools::Production> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_prods field LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.CSymbol.m_prods libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_prods pub m_prods: libremetaverse_lsl_tools::ObjectList owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_refSymbol field LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.CSymbol.m_refSymbol libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_ref_symbol pub m_ref_symbol: libremetaverse_lsl_tools::CSymbol owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_refSymbol field LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.CSymbol.m_refSymbol libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_ref_symbol pub m_ref_symbol: Box<libremetaverse_lsl_tools::CSymbol> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_symtype field LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools.CSymbol.m_symtype libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_symtype pub m_symtype: libremetaverse_lsl_tools::CSymbolSymType owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CSymbol.m_yynum field System.Int32 LibreMetaverse.LslTools.CSymbol.m_yynum libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol::m_yynum pub m_yynum: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CommentList.len field System.Int32 LibreMetaverse.LslTools.CommentList.len libremetaverse-lsl-tools libremetaverse_lsl_tools::CommentList::len pub len: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CommentList.spos field System.Int32 LibreMetaverse.LslTools.CommentList.spos libremetaverse-lsl-tools libremetaverse_lsl_tools::CommentList::spos pub spos: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CommentList.tail field LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.CommentList.tail libremetaverse-lsl-tools libremetaverse_lsl_tools::CommentList::tail pub tail: libremetaverse_lsl_tools::CommentList owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CommentList.tail field LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.CommentList.tail libremetaverse-lsl-tools libremetaverse_lsl_tools::CommentList::tail pub tail: Box<libremetaverse_lsl_tools::CommentList> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CsReader.fname field System.String LibreMetaverse.LslTools.CsReader.fname libremetaverse-lsl-tools libremetaverse_lsl_tools::CsReader::fname pub fname: String owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.CsReader.lm field LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools.CsReader.lm libremetaverse-lsl-tools libremetaverse_lsl_tools::CsReader::lm pub lm: libremetaverse_lsl_tools::LineManager owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Dfa.Action.a_act field System.Int32 LibreMetaverse.LslTools.Dfa.Action.a_act libremetaverse-lsl-tools libremetaverse_lsl_tools::DfaAction::a_act pub a_act: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Dfa.Action.a_next field LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.Action.a_next libremetaverse-lsl-tools libremetaverse_lsl_tools::DfaAction::a_next pub a_next: libremetaverse_lsl_tools::DfaAction owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Dfa.Action.a_next field LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.Action.a_next libremetaverse-lsl-tools libremetaverse_lsl_tools::DfaAction::a_next pub a_next: Box<libremetaverse_lsl_tools::DfaAction> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Dfa.m_actions field LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.m_actions libremetaverse-lsl-tools libremetaverse_lsl_tools::Dfa::m_actions pub m_actions: libremetaverse_lsl_tools::DfaAction owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Dfa.m_map field System.Collections.Hashtable LibreMetaverse.LslTools.Dfa.m_map libremetaverse-lsl-tools libremetaverse_lsl_tools::Dfa::m_map pub m_map: libremetaverse_types::compat::Hashtable owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Dfa.m_reswds field System.Int32 LibreMetaverse.LslTools.Dfa.m_reswds libremetaverse-lsl-tools libremetaverse_lsl_tools::Dfa::m_reswds pub m_reswds: i32 owned_value sync none direct_snake_case direct mapped
@@ -2952,7 +2952,7 @@ F:LibreMetaverse.LslTools.Lexer.m_state field System.String LibreMetaverse.LslTo
F:LibreMetaverse.LslTools.Lexer.yytext field System.String LibreMetaverse.LslTools.Lexer.yytext libremetaverse-lsl-tools libremetaverse_lsl_tools::Lexer::yytext pub yytext: String owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineList.comments field LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.LineList.comments libremetaverse-lsl-tools libremetaverse_lsl_tools::LineList::comments pub comments: libremetaverse_lsl_tools::CommentList owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineList.head field System.Int32 LibreMetaverse.LslTools.LineList.head libremetaverse-lsl-tools libremetaverse_lsl_tools::LineList::head pub head: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineList.tail field LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineList.tail libremetaverse-lsl-tools libremetaverse_lsl_tools::LineList::tail pub tail: libremetaverse_lsl_tools::LineList owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineList.tail field LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineList.tail libremetaverse-lsl-tools libremetaverse_lsl_tools::LineList::tail pub tail: Box<libremetaverse_lsl_tools::LineList> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineManager.end field System.Int32 LibreMetaverse.LslTools.LineManager.end libremetaverse-lsl-tools libremetaverse_lsl_tools::LineManager::end pub end: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineManager.lines field System.Int32 LibreMetaverse.LslTools.LineManager.lines libremetaverse-lsl-tools libremetaverse_lsl_tools::LineManager::lines pub lines: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.LineManager.list field LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineManager.list libremetaverse-lsl-tools libremetaverse_lsl_tools::LineManager::list pub list: libremetaverse_lsl_tools::LineList owned_value sync none direct_snake_case direct mapped
@@ -2964,7 +2964,7 @@ F:LibreMetaverse.LslTools.ParseStackEntry.m_state field System.Int32 LibreMetave
F:LibreMetaverse.LslTools.ParseStackEntry.m_value field LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools.ParseStackEntry.m_value libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseStackEntry::m_value pub m_value: libremetaverse_lsl_tools::SYMBOL owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ParseStackEntry.yyps field LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools.ParseStackEntry.yyps libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseStackEntry::yyps pub yyps: libremetaverse_lsl_tools::Parser owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ParseState.m_accessingSymbol field LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.ParseState.m_accessingSymbol libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState::m_accessing_symbol pub m_accessing_symbol: libremetaverse_lsl_tools::CSymbol owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ParseState.m_sgen field LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.ParseState.m_sgen libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState::m_sgen pub m_sgen: libremetaverse_lsl_tools::SymbolsGen owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ParseState.m_sgen field LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.ParseState.m_sgen libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState::m_sgen pub m_sgen: Box<libremetaverse_lsl_tools::SymbolsGen> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ParseState.m_state field System.Int32 LibreMetaverse.LslTools.ParseState.m_state libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState::m_state pub m_state: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ParseState.m_transitions field System.Collections.Hashtable LibreMetaverse.LslTools.ParseState.m_transitions libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState::m_transitions pub m_transitions: libremetaverse_types::compat::Hashtable owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Parser.m_debug field System.Boolean LibreMetaverse.LslTools.Parser.m_debug libremetaverse-lsl-tools libremetaverse_lsl_tools::Parser::m_debug pub m_debug: bool owned_value sync none direct_snake_case direct mapped
@@ -2989,7 +2989,7 @@ F:LibreMetaverse.LslTools.Precedence.PrecType.before enum_value LibreMetaverse.L
F:LibreMetaverse.LslTools.Precedence.PrecType.left enum_value LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType.left libremetaverse-lsl-tools libremetaverse_lsl_tools::PrecedencePrecType::Left Left: libremetaverse_lsl_tools::PrecedencePrecType owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Precedence.PrecType.nonassoc enum_value LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType.nonassoc libremetaverse-lsl-tools libremetaverse_lsl_tools::PrecedencePrecType::Nonassoc Nonassoc: libremetaverse_lsl_tools::PrecedencePrecType owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Precedence.PrecType.right enum_value LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType.right libremetaverse-lsl-tools libremetaverse_lsl_tools::PrecedencePrecType::Right Right: libremetaverse_lsl_tools::PrecedencePrecType owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Precedence.m_next field LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.Precedence.m_next libremetaverse-lsl-tools libremetaverse_lsl_tools::Precedence::m_next pub m_next: libremetaverse_lsl_tools::Precedence owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Precedence.m_next field LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.Precedence.m_next libremetaverse-lsl-tools libremetaverse_lsl_tools::Precedence::m_next pub m_next: Box<libremetaverse_lsl_tools::Precedence> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Precedence.m_prec field System.Int32 LibreMetaverse.LslTools.Precedence.m_prec libremetaverse-lsl-tools libremetaverse_lsl_tools::Precedence::m_prec pub m_prec: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Precedence.m_type field LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.m_type libremetaverse-lsl-tools libremetaverse_lsl_tools::Precedence::m_type pub m_type: libremetaverse_lsl_tools::PrecedencePrecType owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ProdItem.m_done field System.Boolean LibreMetaverse.LslTools.ProdItem.m_done libremetaverse-lsl-tools libremetaverse_lsl_tools::ProdItem::m_done pub m_done: bool owned_value sync none direct_snake_case direct mapped
@@ -3001,7 +3001,7 @@ F:LibreMetaverse.LslTools.Production.m_lhs field LibreMetaverse.LslTools.CSymbol
F:LibreMetaverse.LslTools.Production.m_pno field System.Int32 LibreMetaverse.LslTools.Production.m_pno libremetaverse-lsl-tools libremetaverse_lsl_tools::Production::m_pno pub m_pno: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Production.m_prec field System.Int32 LibreMetaverse.LslTools.Production.m_prec libremetaverse-lsl-tools libremetaverse_lsl_tools::Production::m_prec pub m_prec: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Production.m_rhs field LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.Production.m_rhs libremetaverse-lsl-tools libremetaverse_lsl_tools::Production::m_rhs pub m_rhs: libremetaverse_lsl_tools::ObjectList owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Regex.m_sub field LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools.Regex.m_sub libremetaverse-lsl-tools libremetaverse_lsl_tools::Regex::m_sub pub m_sub: libremetaverse_lsl_tools::Regex owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.Regex.m_sub field LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools.Regex.m_sub libremetaverse-lsl-tools libremetaverse_lsl_tools::Regex::m_sub pub m_sub: Box<libremetaverse_lsl_tools::Regex> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ResWds.m_upper field System.Boolean LibreMetaverse.LslTools.ResWds.m_upper libremetaverse-lsl-tools libremetaverse_lsl_tools::ResWds::m_upper pub m_upper: bool owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.ResWds.m_wds field System.Collections.Hashtable LibreMetaverse.LslTools.ResWds.m_wds libremetaverse-lsl-tools libremetaverse_lsl_tools::ResWds::m_wds pub m_wds: libremetaverse_types::compat::Hashtable owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SYMBOL.kids field LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.SYMBOL.kids libremetaverse-lsl-tools libremetaverse_lsl_tools::SYMBOL::kids pub kids: libremetaverse_lsl_tools::ObjectList owned_value sync none direct_snake_case direct mapped
@@ -3015,8 +3015,8 @@ F:LibreMetaverse.LslTools.SourceLineInfo.lineNumber field System.Int32 LibreMeta
F:LibreMetaverse.LslTools.SourceLineInfo.lxr field LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools.SourceLineInfo.lxr libremetaverse-lsl-tools libremetaverse_lsl_tools::SourceLineInfo::lxr pub lxr: libremetaverse_lsl_tools::Lexer owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SourceLineInfo.rawCharPosition field System.Int32 LibreMetaverse.LslTools.SourceLineInfo.rawCharPosition libremetaverse-lsl-tools libremetaverse_lsl_tools::SourceLineInfo::raw_char_position pub raw_char_position: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SourceLineInfo.startOfLine field System.Int32 LibreMetaverse.LslTools.SourceLineInfo.startOfLine libremetaverse-lsl-tools libremetaverse_lsl_tools::SourceLineInfo::start_of_line pub start_of_line: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolSet.m_next field LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolSet.m_next libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolSet::m_next pub m_next: libremetaverse_lsl_tools::SymbolSet owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolSet.m_symbols field LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.SymbolSet.m_symbols libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolSet::m_symbols pub m_symbols: libremetaverse_lsl_tools::SymbolsGen owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolSet.m_next field LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolSet.m_next libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolSet::m_next pub m_next: Box<libremetaverse_lsl_tools::SymbolSet> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolSet.m_symbols field LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.SymbolSet.m_symbols libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolSet::m_symbols pub m_symbols: Box<libremetaverse_lsl_tools::SymbolsGen> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolsGen.action field System.Int32 LibreMetaverse.LslTools.SymbolsGen.action libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolsGen::action pub action: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolsGen.lahead field LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolsGen.lahead libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolsGen::lahead pub lahead: libremetaverse_lsl_tools::SymbolSet owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.LslTools.SymbolsGen.m_lalrParser field System.Boolean LibreMetaverse.LslTools.SymbolsGen.m_lalrParser libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolsGen::m_lalr_parser pub m_lalr_parser: bool owned_value sync none direct_snake_case direct mapped
@@ -9467,7 +9467,7 @@ F:LibreMetaverse.Simulator.AgentMovementComplete field System.Boolean LibreMetav
F:LibreMetaverse.Simulator.BillableFactor field System.Single LibreMetaverse.Simulator.BillableFactor libremetaverse libremetaverse::Simulator::billable_factor pub billable_factor: f32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.CPUClass field System.Int32 LibreMetaverse.Simulator.CPUClass libremetaverse libremetaverse::Simulator::cpu_class pub cpu_class: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.CPURatio field System.Int32 LibreMetaverse.Simulator.CPURatio libremetaverse libremetaverse::Simulator::cpu_ratio pub cpu_ratio: i32 owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.Caps field LibreMetaverse.Caps LibreMetaverse.Simulator.Caps libremetaverse libremetaverse::Simulator::caps pub caps: Option<libremetaverse::Caps> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.Caps field LibreMetaverse.Caps LibreMetaverse.Simulator.Caps libremetaverse libremetaverse::Simulator::caps pub caps: Option<Box<libremetaverse::Caps>> owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.Client field LibreMetaverse.GridClient LibreMetaverse.Simulator.Client libremetaverse libremetaverse::Simulator::client pub client: libremetaverse::GridClient owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.ColoLocation field System.String LibreMetaverse.Simulator.ColoLocation libremetaverse libremetaverse::Simulator::colo_location pub colo_location: String owned_value sync none direct_snake_case direct mapped
F:LibreMetaverse.Simulator.DataPool field LibreMetaverse.SimulatorDataPool LibreMetaverse.Simulator.DataPool libremetaverse libremetaverse::Simulator::data_pool pub data_pool: Option<libremetaverse::SimulatorDataPool> owned_value sync none direct_snake_case direct mapped
Can't render this file because it is too large.

View File

@@ -7,16 +7,16 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
| `LibreMetaverse` | 2,711 | 27,281 | callable failure-only shim |
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | callable failure-only shim |
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | callable failure-only shim |
| `LibreMetaverse.LslTools` | 164 | 768 | pending milestone issue |
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
| `LibreMetaverse.PrimMesher` | 17 | 207 | callable failure-only shim |
| `LibreMetaverse.RLV` | 28 | 499 | pending milestone issue |
| `LibreMetaverse.RLV` | 28 | 499 | callable failure-only shim |
| `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | callable failure-only shim |
| `LibreMetaverse.Rendering.Simple` | 1 | 6 | callable failure-only shim |
| `LibreMetaverse.StructuredData` | 16 | 295 | callable failure-only shim |
| `LibreMetaverse.Types` | 45 | 942 | callable failure-only shim |
| `LibreMetaverse.Utilities` | 3 | 13 | pending milestone issue |
| `LibreMetaverse.Voice.Vivox` | 64 | 531 | pending milestone issue |
| `LibreMetaverse.Voice.WebRTC` | 12 | 210 | pending milestone issue |
| `LibreMetaverse.Utilities` | 3 | 13 | callable failure-only shim |
| `LibreMetaverse.Voice.Vivox` | 64 | 531 | callable failure-only shim |
| `LibreMetaverse.Voice.WebRTC` | 12 | 210 | callable failure-only shim |
The `LibreMetaverse` assembly is complete across issue #7 wire/data, issue #8 core runtime/networking,
issue #9 avatar-facing manager, and issue #10 world/social/service manager slices.
@@ -28,4 +28,4 @@ issue #9 avatar-facing manager, and issue #10 world/social/service manager slice
| Issue #9 avatar-facing managers | 193 | 1,934 |
| Issue #10 world/social/service managers | 198 | 1,577 |
Current callable coverage: **2,795 types / 28,768 members**.
Current callable coverage: **3,066 types / 30,789 members**.

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,7 @@
//! LSL parsing tools corresponding to `LibreMetaverse.LslTools`.
extern crate self as libremetaverse_lsl_tools;
mod generated;
pub use generated::*;

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,7 @@
//! Restrained Love Viewer support corresponding to `LibreMetaverse.RLV`.
extern crate self as libremetaverse_rlv;
mod generated;
pub use generated::*;

View File

@@ -136,3 +136,15 @@ pub struct Span<T>(pub PhantomData<fn(T)>);
pub struct RandomSource;
pub struct IAsyncEnumerable<T>(pub PhantomData<fn() -> T>);
pub struct ImmutableDictionary<TKey, TValue>(pub PhantomData<fn(TKey, TValue)>);
pub struct ImmutableList<T>(pub PhantomData<fn(T)>);
pub struct ICollection;
pub struct UnicodeCategory(pub i32);
pub struct TextEncoding;
pub struct SocketException;

View File

@@ -1,27 +1,116 @@
// @generated by tools/generate_surface.py; do not edit by hand.
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
// @generated by tools/generate_api_shims.py; do not edit by hand.
#![allow(clippy::missing_errors_doc)]
#![allow(clippy::must_use_candidate)]
#![allow(clippy::all, clippy::pedantic, dead_code, unused_variables)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
/// `class` shim for C# `LibreMetaverse.Utilities.ConnectionManager`; members remain intentionally unimplemented.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// C# type: `T:LibreMetaverse.Utilities.ConnectionManager`.
pub struct ConnectionManager;
impl ConnectionManager {
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utilities.ConnectionManager";
pub const CSHARP_KIND: &'static str = "class";
/// C# member: `M:LibreMetaverse.Utilities.ConnectionManager.#ctor(LibreMetaverse.GridClient,System.Int32)`.
pub fn new(
client: libremetaverse::GridClient,
timer_frequency: i32,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.ConnectionManager.#ctor(LibreMetaverse.GridClient,System.Int32)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.ConnectionManager.PersistentLogin(LibreMetaverse.GridClient,System.String,System.String,System.String,System.String,System.String,System.String)`.
pub async fn persistent_login(
client: libremetaverse::GridClient,
first_name: String,
last_name: String,
password: String,
user_agent: String,
start: String,
author: String,
) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.ConnectionManager.PersistentLogin(LibreMetaverse.GridClient,System.String,System.String,System.String,System.String,System.String,System.String)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.ConnectionManager.StayInSim(System.UInt64,LibreMetaverse.Vector3)`.
pub fn stay_in_sim(
&self,
handle: u64,
desired_position: libremetaverse_types::Vector3,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.ConnectionManager.StayInSim(System.UInt64,LibreMetaverse.Vector3)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.ConnectionManager.Stop`.
pub fn stop(&self) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Utilities.ConnectionManager.Stop")
}
}
/// `class` shim for C# `LibreMetaverse.Utilities.Realism`; members remain intentionally unimplemented.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// C# type: `T:LibreMetaverse.Utilities.Realism`.
pub struct Realism;
impl Realism {
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utilities.Realism";
pub const CSHARP_KIND: &'static str = "class";
/// C# member: `M:LibreMetaverse.Utilities.Realism.Chat(LibreMetaverse.GridClient,System.String)`.
pub fn chat_with_grid_client_string(
client: libremetaverse::GridClient,
message: String,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.Realism.Chat(LibreMetaverse.GridClient,System.String)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.Realism.Chat(LibreMetaverse.GridClient,System.String,LibreMetaverse.ChatType,System.Int32)`.
pub fn chat_with_grid_client_string_chat_type_int32(
client: libremetaverse::GridClient,
message: String,
type_: libremetaverse::ChatType,
cps: i32,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.Realism.Chat(LibreMetaverse.GridClient,System.String,LibreMetaverse.ChatType,System.Int32)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.Realism.ChatAsync(LibreMetaverse.GridClient,System.String,LibreMetaverse.ChatType,System.Int32,System.Threading.CancellationToken)`.
pub async fn chat_with_grid_client_string_chat_type_int32_cancellation_token(
client: libremetaverse::GridClient,
message: String,
type_: libremetaverse::ChatType,
cps: i32,
cancellation_token: Option<libremetaverse_types::compat::CancellationToken>,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.Realism.ChatAsync(LibreMetaverse.GridClient,System.String,LibreMetaverse.ChatType,System.Int32,System.Threading.CancellationToken)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.Realism.Shoot(LibreMetaverse.GridClient)`.
pub fn shoot_with_grid_client(
client: libremetaverse::GridClient,
) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.Realism.Shoot(LibreMetaverse.GridClient)",
)
}
/// C# member: `M:LibreMetaverse.Utilities.Realism.Shoot(LibreMetaverse.GridClient,LibreMetaverse.Vector3)`.
pub fn shoot_with_grid_client_vector3(
client: libremetaverse::GridClient,
target: libremetaverse_types::Vector3,
) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Utilities.Realism.Shoot(LibreMetaverse.GridClient,LibreMetaverse.Vector3)",
)
}
}
/// `enum` shim for C# `LibreMetaverse.Utilities.WaterType`; members remain intentionally unimplemented.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WaterType;
impl WaterType {
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utilities.WaterType";
pub const CSHARP_KIND: &'static str = "enum";
/// C# type: `T:LibreMetaverse.Utilities.WaterType`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[repr(i32)]
pub enum WaterType {
/// C# member: `F:LibreMetaverse.Utilities.WaterType.Dry`.
Dry = 1,
/// C# member: `F:LibreMetaverse.Utilities.WaterType.Underwater`.
Underwater = 3,
/// C# member: `F:LibreMetaverse.Utilities.WaterType.Unknown`.
Unknown = 0,
/// C# member: `F:LibreMetaverse.Utilities.WaterType.Waterfront`.
Waterfront = 2,
}

View File

@@ -1,5 +1,7 @@
//! Utilities corresponding to `LibreMetaverse.Utilities`.
extern crate self as libremetaverse_utilities;
mod generated;
pub use generated::*;

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,7 @@
//! Vivox adapter corresponding to `LibreMetaverse.Voice.Vivox`.
extern crate self as libremetaverse_voice_vivox;
mod generated;
pub use generated::*;

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,33 @@
//! WebRTC voice adapter corresponding to `LibreMetaverse.Voice.WebRTC`.
extern crate self as libremetaverse_voice_webrtc;
mod generated;
pub use generated::*;
pub use libremetaverse as core;
pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types::NotImplemented as Error;
/// Project-owned boundary types for external JSON signatures.
pub mod signaling {
pub struct JsonValue;
}
/// Project-owned boundary types for external WebRTC transport signatures.
pub mod transport {
pub struct RTCDataChannel;
pub struct RTCPeerConnection;
}
/// Project-owned boundary types for external media signatures.
pub mod media {
pub struct AudioSamplingRatesEnum(pub i32);
}
/// Project-owned boundary types for external audio signatures.
pub mod audio {
pub struct NoiseSuppressionLevel(pub i32);
pub struct SoundFlowAudioEndPoint;
pub struct SoundFlowAudioSource;
}

View File

@@ -23783,7 +23783,7 @@ pub struct PrimitiveConstructionData {
/// C# member: `F:LibreMetaverse.Primitive.ConstructionData.State`.
pub state: u8,
/// C# member: `F:LibreMetaverse.Primitive.ConstructionData.profileCurve`.
pub profile_curve: u8,
pub profile_curve_with_field: u8,
}
impl PrimitiveConstructionData {
/// C# member: `M:LibreMetaverse.Primitive.ConstructionData.#ctor`.

View File

@@ -0,0 +1,84 @@
use libremetaverse::GridClient;
use libremetaverse_lsl_tools::{Parser, YyParser};
use libremetaverse_rlv::{RlvActionCallbacksDefault, RlvRestrictionManager, RlvService};
use libremetaverse_types::compat::{CancellationToken, Guid, Subscription};
use libremetaverse_utilities::ConnectionManager;
use libremetaverse_voice_vivox::{TCPPipe, VoiceManager as VivoxVoiceManager};
use libremetaverse_voice_webrtc::{LibreMetaverseVoiceLogger, VoiceManager as WebRtcVoiceManager};
fn member_id<T>(result: Result<T, libremetaverse_types::NotImplemented>) -> &'static str {
result
.err()
.expect("failure-only shim unexpectedly returned a value")
.csharp_member()
}
async fn compile_rlv_calls(
service: &RlvService,
restrictions: &RlvRestrictionManager,
sender_id: Guid,
token: CancellationToken,
) {
let _: Subscription = restrictions.subscribe_restriction_updated(None);
let _ = service
.process_message(String::new(), sender_id, String::new(), Some(token))
.await;
}
fn compile_parser_call(parser: &Parser) {
let _ = parser.parse_with_string(String::new());
}
async fn compile_utility_call(client: GridClient) {
let _ = ConnectionManager::persistent_login(
client,
String::new(),
String::new(),
String::new(),
String::new(),
String::new(),
String::new(),
)
.await;
}
fn compile_vivox_calls(manager: &VivoxVoiceManager, status: &mut i32) {
let _: Subscription = manager.subscribe_on_login(None);
let _ = manager.login(String::new(), String::new(), String::new(), status);
let _ = manager.request_parcel_voice_info();
}
async fn compile_webrtc_calls(manager: &WebRtcVoiceManager) {
let _: Subscription = manager.subscribe_on_group_voice_joined(None);
let _ = manager.connect_primary_region().await;
let _ = manager.request_parcel_voice_info().await;
}
#[test]
fn extension_flows_have_typed_callable_signatures() {
let _ = compile_rlv_calls;
let _ = compile_parser_call;
let _ = compile_utility_call;
let _ = compile_vivox_calls;
let _ = compile_webrtc_calls;
}
#[test]
fn extension_constructors_fail_with_catalog_ids() {
assert_eq!(
member_id(YyParser::new()),
"M:LibreMetaverse.LslTools.YyParser.#ctor"
);
assert_eq!(
member_id(RlvActionCallbacksDefault::new()),
"M:LibreMetaverse.RLV.RlvActionCallbacksDefault.#ctor"
);
assert_eq!(
member_id(TCPPipe::new()),
"M:LibreMetaverse.Voice.Vivox.TCPPipe.#ctor"
);
assert_eq!(
member_id(LibreMetaverseVoiceLogger::new()),
"M:LibreMetaverse.Voice.WebRTC.LibreMetaverseVoiceLogger.#ctor"
);
}

View File

@@ -21,11 +21,16 @@ COVERAGE = ROOT / "api/SHIM-COVERAGE.md"
TARGETS = {
"LibreMetaverse.Imaging.Abstractions": ROOT / "crates/libremetaverse-imaging/src/generated.rs",
"LibreMetaverse.Imaging.Skia": ROOT / "crates/libremetaverse-imaging-skia/src/generated.rs",
"LibreMetaverse.LslTools": ROOT / "crates/libremetaverse-lsl-tools/src/generated.rs",
"LibreMetaverse.PrimMesher": ROOT / "crates/libremetaverse-prim-mesher/src/generated.rs",
"LibreMetaverse.RLV": ROOT / "crates/libremetaverse-rlv/src/generated.rs",
"LibreMetaverse.Rendering.MeshFoundry": ROOT / "crates/libremetaverse-rendering-mesh-foundry/src/generated.rs",
"LibreMetaverse.Rendering.Simple": ROOT / "crates/libremetaverse-rendering-simple/src/generated.rs",
"LibreMetaverse.Types": ROOT / "crates/libremetaverse-types/src/generated.rs",
"LibreMetaverse.StructuredData": ROOT / "crates/libremetaverse-structured-data/src/generated.rs",
"LibreMetaverse.Utilities": ROOT / "crates/libremetaverse-utilities/src/generated.rs",
"LibreMetaverse.Voice.Vivox": ROOT / "crates/libremetaverse-voice-vivox/src/generated.rs",
"LibreMetaverse.Voice.WebRTC": ROOT / "crates/libremetaverse-voice-webrtc/src/generated.rs",
}
MAIN_TARGET = ROOT / "crates/libremetaverse/src/generated.rs"
@@ -297,12 +302,6 @@ PRIVATE_LAYOUTS = {
"T:LibreMetaverse.StructuredData.OSDUri": [("value", "libremetaverse_types::compat::Uri")],
"T:LibreMetaverse.Imaging.ManagedImage": [("data", "Vec<u8>")],
}
BOXED_FIELDS = {
"F:LibreMetaverse.Caps.Simulator",
"F:LibreMetaverse.Simulator.Caps",
}
def generic_names(item: dict) -> list[str]:
return [parameter["name"] for parameter in item.get("generic_parameters", [])]
@@ -418,16 +417,14 @@ def render_type(item: dict, type_row: dict, member_rows: dict[str, dict[str, str
lines.append(f"pub struct {rust_name};")
else:
lines.append(f"pub struct {rust_name}{suffix} {{")
generics = set(names)
for field in fields:
field_type = mapper.type(field["type"], field.get("nullability"), generics)
if field["doc_id"] in BOXED_FIELDS:
field_type = (
f"Option<Box<{field_type[7:-1]}>>"
if field_type.startswith("Option<")
else f"Box<{field_type}>"
)
lines += [f" /// C# member: `{field['doc_id']}`.", f" pub {mapping.snake(field['name'])}: {field_type},"]
field_signature = member_rows[field["doc_id"]]["rust_signature"]
field_name_match = re.fullmatch(r"pub ([^:]+): (.+)", field_signature)
if not field_name_match:
raise ValueError(f"invalid mapped field signature: {field_signature}")
field_name = field_name_match.group(1)
field_type = field_name_match.group(2)
lines += [f" /// C# member: `{field['doc_id']}`.", f" pub {field_name}: {field_type},"]
for field_name, field_type in private_fields:
lines.append(f" {field_name}: {field_type},")
if names:
@@ -534,10 +531,25 @@ def render_modules(items: list[tuple[dict, dict, bool]], member_rows: dict[str,
def generate_sources(catalog: dict) -> tuple[dict[Path, str], dict[str, tuple[int, int, bool]]]:
type_rows, resolved = mapping.build_type_rows(catalog)
type_by_id = {row["csharp_type_id"]: row for row in type_rows}
member_by_id = {
member["doc_id"]: member
for assembly in catalog["assemblies"]
for item in assembly["types"]
for member in item["members"]
}
configured_main_ids = WIRE_ROOT_TYPES | CORE_ROOT_TYPES | AVATAR_ROOT_TYPES
missing_configured_ids = configured_main_ids - type_by_id.keys()
if missing_configured_ids:
raise ValueError(f"unknown configured main-slice IDs: {sorted(missing_configured_ids)}")
missing_boxed_fields = mapping.BOXED_FIELD_IDS - member_by_id.keys()
if missing_boxed_fields:
raise ValueError(f"unknown configured boxed fields: {sorted(missing_boxed_fields)}")
if invalid_boxed_fields := [
member_id
for member_id in mapping.BOXED_FIELD_IDS
if member_by_id[member_id]["kind"] != "field"
]:
raise ValueError(f"configured boxed members are not fields: {sorted(invalid_boxed_fields)}")
interfaces = {
*{mapping.type_parts(item["signature"])[0] for assembly in catalog["assemblies"] for item in assembly["types"] if item["kind"] == "interface"},
*{

View File

@@ -170,6 +170,21 @@ SUPPORT_TYPES = {
MEMBER_RETURN_OVERRIDES = {
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
}
BOXED_FIELD_IDS = {
"F:LibreMetaverse.Caps.Simulator",
"F:LibreMetaverse.Simulator.Caps",
"F:LibreMetaverse.LslTools.CommentList.tail",
"F:LibreMetaverse.LslTools.CSymbol.m_parser",
"F:LibreMetaverse.LslTools.CSymbol.m_prod",
"F:LibreMetaverse.LslTools.CSymbol.m_refSymbol",
"F:LibreMetaverse.LslTools.Dfa.Action.a_next",
"F:LibreMetaverse.LslTools.LineList.tail",
"F:LibreMetaverse.LslTools.ParseState.m_sgen",
"F:LibreMetaverse.LslTools.Precedence.m_next",
"F:LibreMetaverse.LslTools.Regex.m_sub",
"F:LibreMetaverse.LslTools.SymbolSet.m_next",
"F:LibreMetaverse.LslTools.SymbolSet.m_symbols",
}
RUST_KEYWORDS = {
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn",
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", "ref",
@@ -592,6 +607,12 @@ def member_signature(mapper: Mapper, owner: dict, item: dict, rust_name: str) ->
error_model = "infallible_placeholder"
if kind in {"field", "constant", "enum_value"}:
value_type = mapper.type(item["type"], item.get("nullability"), generics)
if item["doc_id"] in BOXED_FIELD_IDS:
value_type = (
f"Option<Box<{value_type[7:-1]}>>"
if value_type.startswith("Option<")
else f"Box<{value_type}>"
)
if kind == "enum_value":
signature = f"{rust_name}: {value_type}"
elif kind == "constant":
@@ -757,7 +778,20 @@ def validate(catalog: dict, type_rows: list[dict[str, str]], member_rows: list[d
raise ValueError("invalid type mapping status")
if {row["status"] for row in member_rows} - VALID_MEMBER_STATUSES:
raise ValueError("invalid member mapping status")
catalog_ids = {member["doc_id"] for assembly in catalog["assemblies"] for item in assembly["types"] for member in item["members"]}
catalog_members = {
member["doc_id"]: member
for assembly in catalog["assemblies"]
for item in assembly["types"]
for member in item["members"]
}
catalog_ids = catalog_members.keys()
missing_boxed_fields = BOXED_FIELD_IDS - catalog_ids
if missing_boxed_fields:
raise ValueError(f"unknown configured boxed fields: {sorted(missing_boxed_fields)}")
if invalid_boxed_fields := [
member_id for member_id in BOXED_FIELD_IDS if catalog_members[member_id]["kind"] != "field"
]:
raise ValueError(f"configured boxed members are not fields: {sorted(invalid_boxed_fields)}")
mapped_ids = {row["csharp_id"] for row in member_rows}
if catalog_ids != mapped_ids:
raise ValueError(f"catalog/mapping ID mismatch: missing={len(catalog_ids - mapped_ids)}, stale={len(mapped_ids - catalog_ids)}")