Initial MetaCrate rewrite shell
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/target/
|
||||||
123
Cargo.lock
generated
Normal file
123
Cargo.lock
generated
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse-imaging",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
"libremetaverse-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-compat-tests"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-imaging",
|
||||||
|
"libremetaverse-imaging-skia",
|
||||||
|
"libremetaverse-lsl-tools",
|
||||||
|
"libremetaverse-prim-mesher",
|
||||||
|
"libremetaverse-rendering-mesh-foundry",
|
||||||
|
"libremetaverse-rendering-simple",
|
||||||
|
"libremetaverse-rlv",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
"libremetaverse-types",
|
||||||
|
"libremetaverse-utilities",
|
||||||
|
"libremetaverse-voice-vivox",
|
||||||
|
"libremetaverse-voice-webrtc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-imaging"
|
||||||
|
version = "0.0.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-imaging-skia"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse-imaging",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-lsl-tools"
|
||||||
|
version = "0.0.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-prim-mesher"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse-imaging",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-programs"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-imaging-skia",
|
||||||
|
"libremetaverse-voice-vivox",
|
||||||
|
"libremetaverse-voice-webrtc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-rendering-mesh-foundry"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-imaging",
|
||||||
|
"libremetaverse-prim-mesher",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
"libremetaverse-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-rendering-simple"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-rlv"
|
||||||
|
version = "0.0.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-structured-data"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-types"
|
||||||
|
version = "0.0.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-utilities"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
"libremetaverse-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-voice-vivox"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
"libremetaverse-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libremetaverse-voice-webrtc"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
]
|
||||||
33
Cargo.toml
Normal file
33
Cargo.toml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
[workspace]
|
||||||
|
resolver = "3"
|
||||||
|
members = [
|
||||||
|
"crates/libremetaverse-types",
|
||||||
|
"crates/libremetaverse-structured-data",
|
||||||
|
"crates/libremetaverse-imaging",
|
||||||
|
"crates/libremetaverse-imaging-skia",
|
||||||
|
"crates/libremetaverse-prim-mesher",
|
||||||
|
"crates/libremetaverse",
|
||||||
|
"crates/libremetaverse-rendering-simple",
|
||||||
|
"crates/libremetaverse-rendering-mesh-foundry",
|
||||||
|
"crates/libremetaverse-lsl-tools",
|
||||||
|
"crates/libremetaverse-rlv",
|
||||||
|
"crates/libremetaverse-utilities",
|
||||||
|
"crates/libremetaverse-voice-vivox",
|
||||||
|
"crates/libremetaverse-voice-webrtc",
|
||||||
|
"programs",
|
||||||
|
"tests/compat",
|
||||||
|
]
|
||||||
|
|
||||||
|
[workspace.package]
|
||||||
|
version = "0.0.1"
|
||||||
|
edition = "2024"
|
||||||
|
rust-version = "1.85"
|
||||||
|
license = "BSD-3-Clause"
|
||||||
|
repository = "https://github.com/cinderblocks/libremetaverse"
|
||||||
|
|
||||||
|
[workspace.lints.rust]
|
||||||
|
unsafe_code = "forbid"
|
||||||
|
|
||||||
|
[workspace.lints.clippy]
|
||||||
|
all = { level = "warn", priority = -1 }
|
||||||
|
pedantic = { level = "warn", priority = -1 }
|
||||||
35
LICENSE.md
Normal file
35
LICENSE.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
BSD 3-Clause License
|
||||||
|
====================
|
||||||
|
|
||||||
|
Copyright (c) 2006-2016, openmetaverse.co
|
||||||
|
Copyright (c) 2017-2025, Sjofn LLC
|
||||||
|
Copyright (c) 2026, MetaCrate contributors
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of LibreMetaverse nor the names of its contributors may be
|
||||||
|
used to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
This text is based on `libremetaverse/LICENSE.txt` at upstream commit
|
||||||
|
`2aa70bb68513b39795da5d13c88f31b86e85a3ba`. The upstream template placeholder
|
||||||
|
in clause 3 has been resolved to “LibreMetaverse”.
|
||||||
22
README.md
Normal file
22
README.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# MetaCrate
|
||||||
|
|
||||||
|
MetaCrate is a test-driven, clean native Rust reimplementation of
|
||||||
|
[LibreMetaverse](https://github.com/cinderblocks/libremetaverse). LibreMetaverse
|
||||||
|
is a behavioral and API reference only: the finished project must not load,
|
||||||
|
host, bind to, invoke, or ship the .NET implementation. The current
|
||||||
|
stage is a compiling structural shell: crate boundaries mirror the .NET library
|
||||||
|
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. Callable member signatures and semantic Rust test translations are the
|
||||||
|
next two required gates; the current generated declarations are not yet the
|
||||||
|
complete public API shim.
|
||||||
|
|
||||||
|
The source snapshot, compatibility rules, dependency research, and ordered
|
||||||
|
implementation plan are in [RUSTREWRITE.md](RUSTREWRITE.md).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo build --workspace
|
||||||
|
cargo test --workspace --no-run
|
||||||
|
```
|
||||||
|
|
||||||
|
Running `cargo test --workspace` is intentionally red during the shim stage.
|
||||||
711
RUSTREWRITE.md
Normal file
711
RUSTREWRITE.md
Normal file
@@ -0,0 +1,711 @@
|
|||||||
|
# LibreMetaverse to Rust rewrite plan
|
||||||
|
|
||||||
|
## 1. Scope and source of truth
|
||||||
|
|
||||||
|
MetaCrate is a new native Rust implementation of the public API and observable
|
||||||
|
behavior of LibreMetaverse. LibreMetaverse is reference material, not a runtime
|
||||||
|
dependency or implementation component. The source snapshot used to create this
|
||||||
|
shell is:
|
||||||
|
|
||||||
|
- repository: <https://github.com/cinderblocks/libremetaverse>
|
||||||
|
- branch: `master`
|
||||||
|
- commit: `2aa70bb68513b39795da5d13c88f31b86e85a3ba`
|
||||||
|
- commit date: 2026-08-07
|
||||||
|
- local checkout state during inventory: clean
|
||||||
|
- license base: `libremetaverse/LICENSE.txt`, BSD 3-Clause
|
||||||
|
|
||||||
|
Generated inventories are intentionally checked in:
|
||||||
|
|
||||||
|
- `api/TYPES.tsv` maps every discovered public C# type declaration to a Rust
|
||||||
|
crate/module/type and source line.
|
||||||
|
- `api/SURFACE.tsv` records every public declaration line in the 13 library
|
||||||
|
projects, including a SHA-256 digest.
|
||||||
|
- `tests/upstream-tests.json` records every NUnit invocation and the SHA-256 of
|
||||||
|
its C# method body.
|
||||||
|
- `tests/PARITY.md` maps every NUnit invocation to its Rust test name.
|
||||||
|
- `programs/upstream-programs.json` records every source file and digest for the
|
||||||
|
nine sample/tool projects.
|
||||||
|
|
||||||
|
Run `python3 tools/generate_surface.py` after deliberately changing the pinned
|
||||||
|
upstream snapshot. The generator rejects a test count other than 1,295 so an
|
||||||
|
upstream drift cannot silently remove tests. Update the commit constant and
|
||||||
|
review all ledger diffs in the same change.
|
||||||
|
|
||||||
|
### Current shell status
|
||||||
|
|
||||||
|
The current workspace is a structural baseline, not a working client:
|
||||||
|
|
||||||
|
- all 13 public .NET library projects have corresponding Rust crates;
|
||||||
|
- 1,705 public C# type declarations produce compiling Rust type/trait shims;
|
||||||
|
- 12,195 public declaration lines are retained in the API ledger;
|
||||||
|
- 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 generated type shims preserve names and module placement, but they do not
|
||||||
|
yet expose callable C# methods, properties, fields, event payloads, enum values,
|
||||||
|
or delegate signatures. `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 functional porting starts until both missing gates are complete across the
|
||||||
|
entire workspace, rather than one crate at a time:
|
||||||
|
|
||||||
|
1. every public C# type and member has a reviewed, callable Rust signature with
|
||||||
|
an intentionally failing body;
|
||||||
|
2. every C# test is translated semantically and compiles while calling that
|
||||||
|
Rust API;
|
||||||
|
3. only then is behavior implemented, one crate at a time, until those already
|
||||||
|
translated tests turn green.
|
||||||
|
|
||||||
|
### Full-rewrite constraint
|
||||||
|
|
||||||
|
The final project must be entirely implemented in new Rust code. The following
|
||||||
|
are prohibited in production libraries, examples, tools, tests presented as
|
||||||
|
Rust behavior, and release artifacts:
|
||||||
|
|
||||||
|
- loading or hosting the CLR/.NET runtime;
|
||||||
|
- P/Invoke, COM, C ABI, UniFFI, generated bindings, or any other foreign-function
|
||||||
|
bridge to LibreMetaverse assemblies;
|
||||||
|
- invoking `dotnet`, LibreMetaverse programs, or helper services as a subprocess
|
||||||
|
to implement Rust API behavior;
|
||||||
|
- embedding, redistributing, dynamically loading, or downloading compiled
|
||||||
|
LibreMetaverse assemblies;
|
||||||
|
- forwarding calls over IPC/RPC to a running C# implementation;
|
||||||
|
- retaining a C# fallback path for APIs not yet implemented in Rust;
|
||||||
|
- treating an interoperability comparison harness as the implementation.
|
||||||
|
|
||||||
|
During development, the pinned C# source and compiled metadata may be inspected
|
||||||
|
to inventory public signatures, understand algorithms and state transitions,
|
||||||
|
and create golden inputs/outputs. The original C# tests and programs may be run
|
||||||
|
separately as an oracle to produce or compare fixtures. Those development tools
|
||||||
|
must remain outside the Rust runtime graph, must not be required to build or use
|
||||||
|
published Rust crates, and must never satisfy a Rust compatibility test by
|
||||||
|
executing the C# implementation.
|
||||||
|
|
||||||
|
Third-party native libraries such as OpenJPEG, Skia, libopus, operating-system
|
||||||
|
APIs, and ordinary Rust crates are allowed where documented and license-
|
||||||
|
compatible; the prohibition is specifically against reusing LibreMetaverse or
|
||||||
|
another port of its implementation behind a foreign interface. All
|
||||||
|
LibreMetaverse-specific protocol logic, models, state machines, managers,
|
||||||
|
serialization rules, and public behavior must be reimplemented in Rust.
|
||||||
|
|
||||||
|
The final release gate must verify that published crate metadata and built
|
||||||
|
artifacts contain no dependency on `dotnet`, Mono, CLR hosting APIs, C#
|
||||||
|
assemblies, or LibreMetaverse bridge libraries. A clean machine with only the
|
||||||
|
documented Rust/native prerequisites must be able to build, test, document, and
|
||||||
|
run the Rust implementation.
|
||||||
|
|
||||||
|
## 2. Workspace design
|
||||||
|
|
||||||
|
| Rust crate | C# project | C# files | C# lines | Public declaration rows | Responsibility |
|
||||||
|
|---|---|---:|---:|---:|---|
|
||||||
|
| `libremetaverse-types` | `LibreMetaverse.Types` | 22 | 9,292 | 703 | UUIDs, math types, enums, caches and small collections |
|
||||||
|
| `libremetaverse-structured-data` | `LibreMetaverse.StructuredData` | 10 | 4,069 | 303 | OSD value model and LLSD encodings |
|
||||||
|
| `libremetaverse-imaging` | `LibreMetaverse.Imaging.Abstractions` | 2 | 454 | 18 | codec traits and managed image representation |
|
||||||
|
| `libremetaverse-imaging-skia` | `LibreMetaverse.Imaging.Skia` | 1 | 369 | 3 | optional Skia codec adapter |
|
||||||
|
| `libremetaverse-prim-mesher` | `LibreMetaverse.PrimMesher` | 5 | 3,477 | 222 | prim/sculpt mesh generation |
|
||||||
|
| `libremetaverse` | `LibreMetaverse` | 210 | 138,916 | 8,982 | client, protocol, managers, assets and rendering model |
|
||||||
|
| `libremetaverse-rendering-simple` | `LibreMetaverse.Rendering.Simple` | 1 | 161 | 6 | simple renderer |
|
||||||
|
| `libremetaverse-rendering-mesh-foundry` | `LibreMetaverse.Rendering.MeshFoundry` | 1 | 852 | 14 | full mesh renderer |
|
||||||
|
| `libremetaverse-lsl-tools` | `LibreMetaverse.LslTools` | 175 | 27,856 | 962 | LSL lexer/parser generator and generated grammar |
|
||||||
|
| `libremetaverse-rlv` | `LibreMetaverse.RLV` | 32 | 6,296 | 262 | RLV parsing, restrictions, locks and callbacks |
|
||||||
|
| `libremetaverse-utilities` | `LibreMetaverse.Utilities` | 1 | 289 | 12 | high-level convenience helpers |
|
||||||
|
| `libremetaverse-voice-vivox` | `LibreMetaverse.Voice.Vivox` | 12 | 4,544 | 440 | Vivox control protocol adapter |
|
||||||
|
| `libremetaverse-voice-webrtc` | `LibreMetaverse.Voice.WebRTC` | 11 | 7,023 | 268 | WebRTC voice adapter |
|
||||||
|
|
||||||
|
`libremetaverse` is the umbrella client crate. It re-exports the foundational
|
||||||
|
crates under `types`, `structured_data`, and `imaging_abstractions`. Rendering,
|
||||||
|
voice, RLV, LSL tools, and native Skia remain separate so users do not pay for
|
||||||
|
large or platform-specific dependency trees unless requested.
|
||||||
|
|
||||||
|
The workspace uses Rust 2024 with MSRV 1.85. Generated code is committed so
|
||||||
|
ordinary consumers do not need Python, .NET, Roslyn, or the upstream checkout.
|
||||||
|
|
||||||
|
## 3. Public API translation policy
|
||||||
|
|
||||||
|
Compatibility means the same concepts, wire behavior, state transitions,
|
||||||
|
errors, and event payloads. It does not mean mechanically reproducing C# syntax.
|
||||||
|
Apply these rules consistently:
|
||||||
|
|
||||||
|
| C# surface | Rust surface |
|
||||||
|
|---|---|
|
||||||
|
| `LibreMetaverse.Foo.Bar` | the owning crate plus `foo::Bar`; omit the repeated assembly namespace |
|
||||||
|
| PascalCase methods | `snake_case`; add a deprecated PascalCase forwarding method only when migration evidence justifies it |
|
||||||
|
| `Task<T>` / `Task` | `async fn -> Result<T, Error>` / `async fn -> Result<(), Error>` |
|
||||||
|
| `Async` method suffix | omit it when the Rust method is `async`; document the C# source name |
|
||||||
|
| `CancellationToken` | `tokio_util::sync::CancellationToken` at long-lived operation boundaries |
|
||||||
|
| nullable reference | `Option<T>`; never use a sentinel UUID/string unless the protocol defines one |
|
||||||
|
| exception hierarchy | small non-exhaustive `thiserror` enums per crate; retain source error and protocol context |
|
||||||
|
| public mutable property | private field plus validated getter/setter, or a public field only for inert value records |
|
||||||
|
| overloads | one method with typed parameter structs; use separate descriptive names when operations differ semantically |
|
||||||
|
| interface | object-safe trait when dynamic dispatch is required, otherwise a generic trait bound |
|
||||||
|
| delegate | `Fn`, `FnMut`, or `FnOnce` bounds; boxed callback only when callbacks are stored |
|
||||||
|
| .NET event | typed subscription returning a guard, or a `tokio::sync::broadcast` receiver for asynchronous fan-out |
|
||||||
|
| `IDisposable` | ownership and `Drop`; add explicit `close`/`shutdown().await` when failure or async work must be observed |
|
||||||
|
| `byte[]` | borrowed `&[u8]` for parsing, `bytes::Bytes` for shared network payloads, `Vec<u8>` for owned mutation |
|
||||||
|
| `IReadOnlyList<T>` | `&[T]` or `Arc<[T]>`; return iterators when callers do not need storage |
|
||||||
|
| `Dictionary` | `HashMap`; use `BTreeMap` only when deterministic ordering is observable |
|
||||||
|
| immutable collections | owned `Vec`/`HashMap` or `Arc<[T]>`; do not add a persistent-collection crate without a measured need |
|
||||||
|
| monitor/reader-writer lock | `std::sync` first; use `parking_lot` only after profiling or poisoning-policy review |
|
||||||
|
| generated flags enum | `bitflags`; preserve unknown bits with `from_bits_retain` |
|
||||||
|
| C# enum on the wire | `#[repr(...)]` plus checked conversion; include `Unknown(raw)` when the protocol is extensible |
|
||||||
|
| `UUID` | a compatibility newtype around `uuid::Uuid`, with explicit big/little-endian wire helpers |
|
||||||
|
| vectors/quaternions/matrices | compatibility structs with LibreMetaverse field/order semantics; use `glam` internally after parity tests prove conversions |
|
||||||
|
| dependency injection container | normal constructors and explicit trait parameters; add no service-locator equivalent |
|
||||||
|
|
||||||
|
Public structs and enums that come from the protocol must be `#[non_exhaustive]`
|
||||||
|
when servers may add values. Do not derive `Serialize`/`Deserialize` as a
|
||||||
|
substitute for the specified wire encoding: LLUDP, LLSD, MessagePack, asset
|
||||||
|
formats, and login XML each require their own compatibility tests.
|
||||||
|
|
||||||
|
### 3.1 Full signature-shim gate
|
||||||
|
|
||||||
|
The first handover task after this structural shell is a complete callable API
|
||||||
|
shim. Do not start real behavior while completing it.
|
||||||
|
|
||||||
|
Build the authoritative API catalog during development from compiled .NET
|
||||||
|
metadata after running the original source generators, not from the line-
|
||||||
|
oriented regex ledger alone. This extraction is an inventory tool only and must
|
||||||
|
not become a build-time or runtime dependency of the Rust crates.
|
||||||
|
Build one supported target framework into a temporary output directory and use
|
||||||
|
`System.Reflection.Metadata` or Roslyn symbols to emit machine-readable records
|
||||||
|
for every public/nested-public:
|
||||||
|
|
||||||
|
- class, struct, record, interface, enum and delegate, including generic
|
||||||
|
parameters and constraints;
|
||||||
|
- constructor and method, including overloads, ref/out/in parameters, optional
|
||||||
|
values and return type;
|
||||||
|
- property/indexer and getter/setter visibility;
|
||||||
|
- field and constant, including value and numeric width;
|
||||||
|
- event and delegate payload;
|
||||||
|
- base type, implemented interface and relevant public attribute.
|
||||||
|
|
||||||
|
Create `api/public-api.json` as that catalog and `api/RUST-MAPPING.tsv` with one
|
||||||
|
row per C# member: stable C# documentation ID, C# signature, Rust crate/path,
|
||||||
|
Rust signature, mapping decision, and status. A coverage checker must fail for
|
||||||
|
missing members, duplicate Rust destinations, unresolved types, or stale source
|
||||||
|
IDs. `api/SURFACE.tsv` remains useful for source navigation but is not the
|
||||||
|
coverage authority.
|
||||||
|
|
||||||
|
Each mapped Rust item must actually compile and be callable:
|
||||||
|
|
||||||
|
- methods, constructors and property accessors have their final reviewed Rust
|
||||||
|
names, parameters, ownership/borrowing, asyncness, and return types;
|
||||||
|
- overloads use stable descriptive Rust names or typed argument structs, with
|
||||||
|
the mapping recorded explicitly;
|
||||||
|
- enums contain their real variants/discriminants and flags contain their real
|
||||||
|
bits, because tests and downstream code must compile against them;
|
||||||
|
- event payloads, delegates and interfaces have their real fields/trait methods;
|
||||||
|
- generic bounds and thread-safety guarantees are deliberate, not erased to an
|
||||||
|
untyped placeholder.
|
||||||
|
|
||||||
|
The body is the only part allowed to be fake. Fallible Rust APIs return a shared
|
||||||
|
typed `NotImplemented { csharp_member }` error. Infallible constructors,
|
||||||
|
accessors, operators and trait methods call a shared `unimplemented_api!`
|
||||||
|
placeholder that panics with the stable C# member ID. Constants and enum values
|
||||||
|
must have their real values. Never return plausible defaults such as `false`,
|
||||||
|
zero, an empty collection, or a nil UUID: those could make translated tests pass
|
||||||
|
for the wrong reason.
|
||||||
|
|
||||||
|
The signature gate is complete only when:
|
||||||
|
|
||||||
|
- the metadata catalog reports 100% public type/member mapping coverage for all
|
||||||
|
13 library assemblies, including generated APIs;
|
||||||
|
- all crates build and `cargo doc` resolves every public signature;
|
||||||
|
- a downstream compile fixture can name/call every mapped Rust item;
|
||||||
|
- there are no erased `ShimValue`, dynamic argument bags, invented variadics,
|
||||||
|
or member signatures present only as ledger text;
|
||||||
|
- implementation bodies contain only the standardized failure placeholder,
|
||||||
|
constants, enum discriminants, and inert data-layout boilerplate.
|
||||||
|
|
||||||
|
### 3.2 Full semantic test-suite gate
|
||||||
|
|
||||||
|
After the full signature shim compiles, translate the entire C# test suite while
|
||||||
|
leaving all library bodies unimplemented. Every one of the 1,295 NUnit
|
||||||
|
invocations must become a Rust test with the same inputs, setup, operation,
|
||||||
|
observations, assertions, tolerances and expected error/event behavior. Shared
|
||||||
|
C# test helpers become shared Rust test helpers; embedded fixtures and literal
|
||||||
|
payloads are copied with license/source attribution and byte hashes.
|
||||||
|
|
||||||
|
The Rust tests must call the public APIs rather than internal replacements.
|
||||||
|
Where the C# tests call internal members through friend-assembly access, record
|
||||||
|
that fact and place equivalent Rust unit tests inside the owning crate without
|
||||||
|
making the member public solely for testing.
|
||||||
|
|
||||||
|
The tests must compile even though running them is red. An expected C# exception
|
||||||
|
maps to a specific Rust `Err` variant, never to `should_panic` around a public
|
||||||
|
API call; this ensures an `unimplemented_api!` panic remains a failure rather
|
||||||
|
than accidentally satisfying the test. Only tests whose C# purpose is genuinely
|
||||||
|
to verify a thrown runtime invariant may use `catch_unwind`/`should_panic`, and
|
||||||
|
they must distinguish the intended invariant from the placeholder panic.
|
||||||
|
|
||||||
|
The test-suite gate is complete only when:
|
||||||
|
|
||||||
|
- `pending(` occurs zero times in Rust test sources;
|
||||||
|
- the parity catalog reports exactly one reviewed Rust case for every upstream
|
||||||
|
`[Test]`/`[TestCase]`, with the matching C# body hash;
|
||||||
|
- `cargo test --workspace --no-run` compiles all tests against public signatures;
|
||||||
|
- a controlled test run fails at standardized unimplemented member IDs rather
|
||||||
|
than from missing symbols, compile errors, malformed fixtures, or weakened
|
||||||
|
assertions;
|
||||||
|
- live-server/device tests are faithfully translated but `#[ignore]` by default
|
||||||
|
with documented opt-in configuration;
|
||||||
|
- no production method contains real behavior beyond what is required to make
|
||||||
|
signatures and constants compile.
|
||||||
|
|
||||||
|
## 4. Validated Rust dependency map
|
||||||
|
|
||||||
|
Versions below were queried from crates.io on 2026-08-08 with `cargo search`
|
||||||
|
and, for risky/native crates, `cargo info`. They are candidates, not blanket
|
||||||
|
dependencies. Add one to a crate only when its first implementation uses it,
|
||||||
|
then commit `Cargo.lock` for application/test reproducibility. Recheck versions,
|
||||||
|
MSRV, features, and licenses at adoption time.
|
||||||
|
|
||||||
|
| .NET/NuGet responsibility | Rust candidate and validated version | Adoption notes |
|
||||||
|
|---|---|---|
|
||||||
|
| async runtime, channels, timers | [`tokio` 1.53.1](https://crates.io/crates/tokio/1.53.1), [`tokio-util` 0.7.19](https://crates.io/crates/tokio-util/0.7.19), [`futures` 0.3.33](https://crates.io/crates/futures/0.3.33) | One Tokio runtime owned by the application; libraries never create nested runtimes. |
|
||||||
|
| `System.Net.Http` / WinHTTP | [`reqwest` 0.13.4](https://crates.io/crates/reqwest/0.13.4) | MSRV 1.85. Use rustls/default TLS deliberately, connection pooling, streaming bodies, and injected client/timeouts. |
|
||||||
|
| JSON and general data mapping | [`serde` 1.0.229](https://crates.io/crates/serde/1.0.229), [`serde_json` 1.0.151](https://crates.io/crates/serde_json/1.0.151), [`serde_bytes` 0.11.19](https://crates.io/crates/serde_bytes/0.11.19) | Use only where the C# implementation is schema-driven JSON. Hand-write LLSD encodings. |
|
||||||
|
| MessagePack 3.1.8 | [`rmp-serde` 1.3.1](https://crates.io/crates/rmp-serde/1.3.1), [`rmpv` 1.3.1](https://crates.io/crates/rmpv/1.3.1) | Golden byte vectors must prove integer widths, maps, extensions, and field ordering. |
|
||||||
|
| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. |
|
||||||
|
| byte buffers | [`bytes` 1.12.1](https://crates.io/crates/bytes/1.12.1), [`bytemuck` 1.25.2](https://crates.io/crates/bytemuck/1.25.2) | Prefer explicit endian reads. `bytemuck` is only for proven POD layouts, never untrusted variable packets. |
|
||||||
|
| vector/matrix math | [`glam` 0.33.3](https://crates.io/crates/glam/0.33.3) | Keep compatibility newtypes to control component order, precision, equality, and serialization. |
|
||||||
|
| flags | [`bitflags` 2.13.1](https://crates.io/crates/bitflags/2.13.1) | Retain unknown bits from newer grids. |
|
||||||
|
| errors | [`thiserror` 2.0.20](https://crates.io/crates/thiserror/2.0.20) | Application binaries may use richer reporting; public libraries return typed errors. |
|
||||||
|
| ZLogger / Microsoft logging | [`tracing` 0.1.44](https://crates.io/crates/tracing/0.1.44), [`tracing-subscriber` 0.3.23](https://crates.io/crates/tracing-subscriber/0.3.23) | Libraries emit spans/events; binaries choose formatting and filters. Never log credentials or capability tokens. |
|
||||||
|
| rate limiting | [`governor` 0.10.4](https://crates.io/crates/governor/0.10.4) | Candidate for caps categories. First reproduce burst/refill/cancellation behavior with deterministic clock tests. |
|
||||||
|
| compression and tar archives | [`flate2` 1.1.9](https://crates.io/crates/flate2/1.1.9), [`tar` 0.4.46](https://crates.io/crates/tar/0.4.46) | Enforce decompressed-size, path traversal, and entry-count limits on untrusted OAR data. |
|
||||||
|
| XML and URL | [`quick-xml` 0.41.0](https://crates.io/crates/quick-xml/0.41.0), [`url` 2.5.8](https://crates.io/crates/url/2.5.8), [`base64` 0.23.1](https://crates.io/crates/base64/0.23.1) | Streaming XML for LLSD/login; retain exact URL escaping behavior with fixtures. |
|
||||||
|
| CoreJ2K 2.3.3.91 | [`jpeg2k` 0.10.1](https://crates.io/crates/jpeg2k/0.10.1) | Defaults to OpenJPEG/native bindings. Keep behind a codec trait and feature; test channel order, alpha, dimensions, discard levels, and malformed input. |
|
||||||
|
| SkiaSharp 4.150.1 | [`skia-safe` 0.99.0](https://crates.io/crates/skia-safe/0.99.0) | MSRV 1.85 and native/binary-cache build. Optional adapter only; core image APIs must not leak Skia types. |
|
||||||
|
| Pfim 0.11.4 | [`image` 0.25.10](https://crates.io/crates/image/0.25.10), [`ddsfile` 0.6.0](https://crates.io/crates/ddsfile/0.6.0) | `image` covers TGA and common DDS decoding; `ddsfile` exposes DDS container details. Golden files decide whether both are needed. |
|
||||||
|
| OggVorbisEncoder 1.2.2 | [`vorbis_rs` 0.5.6](https://crates.io/crates/vorbis_rs/0.5.6) | BSD-3-Clause, MSRV 1.82, backed by C libraries. Feature-gate native audio encoding. |
|
||||||
|
| SIPSorcery 8.0.23 | [`webrtc` 0.20.0](https://crates.io/crates/webrtc/0.20.0), [`cpal` 0.18.1](https://crates.io/crates/cpal/0.18.1), [`opus` 0.3.1](https://crates.io/crates/opus/0.3.1) | Validate SDP, ICE, data-channel framing, audio formats, device hotplug, and native libopus deployment separately. Do not claim parity from successful compilation. |
|
||||||
|
| LSL generated parser | [`lalrpop` 0.23.1](https://crates.io/crates/lalrpop/0.23.1) | Candidate only. Preserve grammar conflicts, recovery, token positions, and diagnostics before replacing the generated parser. |
|
||||||
|
| NUnit/Moq | built-in test harness, [`mockall` 0.15.0](https://crates.io/crates/mockall/0.15.0), [`proptest` 1.11.0](https://crates.io/crates/proptest/1.11.0) | Prefer fakes and deterministic protocol fixtures; use mocks only for interaction contracts. Add properties after direct parity cases exist. |
|
||||||
|
| NUnit benchmarks | [`criterion` 0.8.2](https://crates.io/crates/criterion/0.8.2) | Port benchmark-category methods to `benches/`; never make timing thresholds correctness tests. |
|
||||||
|
| sample command lines | [`clap` 4.6.6](https://crates.io/crates/clap/4.6.6) | Add when implementing the first real program CLI; keep credentials in arguments/env only long enough to authenticate. |
|
||||||
|
|
||||||
|
`System.*`, BCL compatibility packages, immutable collections, DI abstractions,
|
||||||
|
and object pooling usually map to the Rust standard library and ownership. Do
|
||||||
|
not select a crate merely because NuGet used one. In particular, begin with
|
||||||
|
`Mutex<HashMap<...>>` rather than a concurrent-map dependency and add a pool
|
||||||
|
only after allocations appear in a profile.
|
||||||
|
|
||||||
|
## 5. Module-by-module implementation guidance
|
||||||
|
|
||||||
|
### 5.1 `libremetaverse-types`
|
||||||
|
|
||||||
|
This is the first implementation crate because nearly every protocol and test
|
||||||
|
depends on it.
|
||||||
|
|
||||||
|
- **UUID:** wrap `uuid::Uuid`; implement zero/random/parse/format, byte-array
|
||||||
|
constructors, CRC/combine helpers, ordering, hashing, and every endian path
|
||||||
|
from `UUID.cs`. Keep the `UUID` name as a public compatibility type.
|
||||||
|
- **Vector2/3/3d/4, Quaternion, Matrix4, Ray, Color4:** preserve constructors,
|
||||||
|
constants, component order, normalization of zero values, quaternion
|
||||||
|
multiplication direction, approximate-comparison helpers, and binary/string
|
||||||
|
formats. Use `glam` internally only after conversion tests pass.
|
||||||
|
- **Enums and primitive enums:** translate exact numeric discriminants and flag
|
||||||
|
widths. Use `bitflags` where C# uses `[Flags]`; retain unknown values/bits.
|
||||||
|
- **CRC32 and conversions:** port byte-for-byte with fixed golden vectors and
|
||||||
|
explicit endianness. Avoid platform-sized integers on the wire.
|
||||||
|
- **CacheDictionary, ExpiringCache, TokenBucket:** inject a clock in tests;
|
||||||
|
preserve expiry/burst semantics. Start with `HashMap` plus one lock.
|
||||||
|
- **DoubleDictionary and MultiValueDictionary:** expose iterators and borrowing
|
||||||
|
rather than cloning collections. Preserve duplicate and replacement rules.
|
||||||
|
|
||||||
|
Completion gate: every Types-related parity test is a semantic Rust test, all
|
||||||
|
format/byte fixtures match C#, and no generated shim remains for a Types API.
|
||||||
|
|
||||||
|
### 5.2 `libremetaverse-structured-data`
|
||||||
|
|
||||||
|
- **OSD value model:** implement a non-exhaustive enum for undefined, boolean,
|
||||||
|
integer, real, string, UUID, date, URI, binary, array, and map. Preserve C#
|
||||||
|
conversion/default behavior deliberately; do not let `serde_json::Value`
|
||||||
|
define the public model.
|
||||||
|
- **OSDArray/OSDMap:** wrap `Vec<OSD>` and an order-appropriate map. Verify
|
||||||
|
whether serialized map ordering is observable in each format before choosing
|
||||||
|
`HashMap` versus `BTreeMap`/insertion order.
|
||||||
|
- **Binary LLSD:** streaming parser over `&[u8]`/`Read`; checked lengths,
|
||||||
|
recursion limits, exact endian rules, and no panics on malformed input.
|
||||||
|
- **Notation LLSD:** preserve escaping, length-prefixed strings/binary, numbers,
|
||||||
|
dates, URIs, whitespace, and error positions.
|
||||||
|
- **XML LLSD:** use `quick-xml`; reject/entity-limit hostile input and retain
|
||||||
|
exact element mapping.
|
||||||
|
- **JSON LLSD:** use `serde_json` behind explicit OSD conversions so UUID/date/
|
||||||
|
URI/binary tagging remains compatible.
|
||||||
|
- **Protobuf OSD:** first identify whether this is a stable external format. If
|
||||||
|
stable, preserve tags with generated Rust types; otherwise keep it internal.
|
||||||
|
|
||||||
|
Completion gate: parse and emit C# golden bytes/text for every format, including
|
||||||
|
malformed, deep, empty, Unicode, NaN/infinity, and cross-format cases.
|
||||||
|
|
||||||
|
### 5.3 `libremetaverse-imaging`
|
||||||
|
|
||||||
|
- Translate `ManagedImage` as an owned image buffer with explicit dimensions,
|
||||||
|
channel flags/layout, stride, and checked size arithmetic.
|
||||||
|
- Translate `ITextureCodec` to an object-safe `TextureCodec` trait only if
|
||||||
|
runtime codec selection is needed. Codec methods return typed decode/encode
|
||||||
|
errors and accept limits.
|
||||||
|
- Keep public APIs independent of Skia/OpenJPEG types so pure-Rust or platform
|
||||||
|
codecs can be substituted.
|
||||||
|
|
||||||
|
Completion gate: channel interleave/deinterleave, resize, alpha/bump behavior,
|
||||||
|
and invalid-dimension tests match the original.
|
||||||
|
|
||||||
|
### 5.4 `libremetaverse-imaging-skia`
|
||||||
|
|
||||||
|
Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`. Convert at
|
||||||
|
the boundary to/from `ManagedImage`; never expose `skia_safe` types in the core
|
||||||
|
trait. CI must cover macOS, Linux, and Windows or explicitly document unsupported
|
||||||
|
targets. Validate native binary provenance and packaging.
|
||||||
|
|
||||||
|
### 5.5 `libremetaverse-prim-mesher`
|
||||||
|
|
||||||
|
- Port `Coord`, `Quat`, faces, paths, profiles, viewer faces, and indexing as
|
||||||
|
value types with checked indices.
|
||||||
|
- Port linear/circular extrusion before sculpt meshing. Preserve winding,
|
||||||
|
normals, UVs, face numbering, hollow/profile cuts, twists, tapers, and shears.
|
||||||
|
- Port `SculptMap` decoding through `libremetaverse-imaging`, then `SculptMesh`.
|
||||||
|
- Make OBJ export a formatting layer over mesh data; deterministic output is a
|
||||||
|
testable contract.
|
||||||
|
|
||||||
|
Completion gate: all 48 PrimMesher rendering-test invocations and all
|
||||||
|
MeshFoundry tests are semantic ports, face indices stay in range, and C# versus
|
||||||
|
Rust mesh fixtures compare within the original tolerances.
|
||||||
|
|
||||||
|
### 5.6 `libremetaverse` protocol and client core
|
||||||
|
|
||||||
|
Implement the central crate in dependency slices, not file order.
|
||||||
|
|
||||||
|
#### Wire protocol and generated packets
|
||||||
|
|
||||||
|
- Port `BitPack`, zero coding, packet headers, ACK handling, sequence numbers,
|
||||||
|
fragmentation, throttles, and `UDPPacketBuffer` first.
|
||||||
|
- Replace the six Roslyn source generators with a Rust `codegen` tool/build step
|
||||||
|
reading the same `data/` and `linden/` inputs. Commit generated packet,
|
||||||
|
visual-parameter, skeleton, tree, genepool, and attention Rust sources.
|
||||||
|
- The generator must produce deterministic output; CI regenerates to a temporary
|
||||||
|
directory and fails on diff. Generated packet tests compare exact bytes and
|
||||||
|
IDs against C# fixtures.
|
||||||
|
- Parsers operate on borrowed slices where practical and reject truncated,
|
||||||
|
oversized, or unknown blocks without unchecked indexing.
|
||||||
|
|
||||||
|
#### Networking and capabilities
|
||||||
|
|
||||||
|
- `UDPBase`, `NetworkManager`, `Simulator`, `ProtocolManager`, and `UdpThrottle`
|
||||||
|
use Tokio UDP tasks with explicit ownership and cancellation. One task owns
|
||||||
|
socket writes; decoded events cross bounded channels to prevent unbounded
|
||||||
|
memory growth.
|
||||||
|
- `Caps`, `HttpCapsClient`, event queue, caps-to-packet, and rate limiting use an
|
||||||
|
injected `reqwest::Client`. Preserve redirects, content types, retry policy,
|
||||||
|
cancellation, progress reporting, and non-HTTP location rejection.
|
||||||
|
- Login/XML-RPC, seed capabilities, region crossing, reconnect, logout, and
|
||||||
|
timeout state transitions must be modeled explicitly and tested with local
|
||||||
|
fake servers before live-grid use.
|
||||||
|
- Capability URLs/tokens and login credentials are secrets: redact them from
|
||||||
|
`Debug` and logs.
|
||||||
|
|
||||||
|
#### Grid client and service composition
|
||||||
|
|
||||||
|
- `GridClient` owns managers and shared runtime state. Construct it with a
|
||||||
|
`GridClientBuilder` only for real optional policies/codecs; required services
|
||||||
|
remain constructor arguments.
|
||||||
|
- Replace `IGridClient` and service-collection extensions with focused traits at
|
||||||
|
test seams. Avoid a general service locator.
|
||||||
|
- `Settings/*` become typed configuration structs grouped like the C# settings,
|
||||||
|
with validated durations/sizes and defaults proven by tests.
|
||||||
|
- `Logger` maps to `tracing`; `UtilizationStatistics` exports snapshots without
|
||||||
|
making a metrics backend mandatory.
|
||||||
|
|
||||||
|
#### Agent, movement, chat, effects, teleport and money
|
||||||
|
|
||||||
|
- Port `AgentManager` partial files as modules under `agent`, but expose one
|
||||||
|
coherent `AgentManager` API. Keep camera/movement state separate from network
|
||||||
|
commands.
|
||||||
|
- Event-argument classes become event structs. Subscriptions must be removable
|
||||||
|
and must not retain the whole client after drop.
|
||||||
|
- Teleport and region crossing are explicit state machines with timeout,
|
||||||
|
cancellation, progress, failure reason, and simulator handoff tests.
|
||||||
|
- Money and permissions paths use fixed integer widths and never log sensitive
|
||||||
|
transaction descriptions without opt-in.
|
||||||
|
|
||||||
|
#### Inventory
|
||||||
|
|
||||||
|
- Port inventory enums/base records/nodes/store before `InventoryManager`.
|
||||||
|
Preserve link resolution, folder/item distinctions, ownership and permissions.
|
||||||
|
- Separate local tree/cache mutation from UDP/capability transport. This makes
|
||||||
|
`InventoryAISClient` independently testable with recorded LLSD fixtures.
|
||||||
|
- Async fetch, give, rez, task inventory, current outfit folder, and callbacks
|
||||||
|
must have cancellation and deduplication tests. Do not hold locks across
|
||||||
|
`.await`.
|
||||||
|
- Persisted cache format needs versioning, atomic replacement, corruption
|
||||||
|
handling, and bounded deserialization.
|
||||||
|
|
||||||
|
#### Assets, appearance, avatar and animesh
|
||||||
|
|
||||||
|
- Port the base `Asset` model and individual asset types as typed wrappers over
|
||||||
|
validated bytes. Decode lazily where the C# behavior permits.
|
||||||
|
- `AssetManager`, `AssetCache`, `DownloadManager`, and `TexturePipeline` share a
|
||||||
|
deduplicating request layer with bounded concurrency and cancellation.
|
||||||
|
- Port wearables, baking, current-outfit policies, texture compositing, avatar
|
||||||
|
definitions, skeleton, visual params, animations, gestures, and animesh in
|
||||||
|
that order. Copy and retain the upstream Linden assets only after reviewing
|
||||||
|
their separate `cc-by-sa-3.0.txt` obligations.
|
||||||
|
- Animation interpolation, joint transforms, skinning, attachment rigs, and
|
||||||
|
physics must use the original test tolerances and matrix multiplication order.
|
||||||
|
|
||||||
|
#### Objects, parcels, terrain, environment and rendering model
|
||||||
|
|
||||||
|
- Port `Primitive`, texture entry, media, particles, permissions, materials,
|
||||||
|
and simulator collections before `ObjectManager`.
|
||||||
|
- Object updates need an explicit decode/apply split; preserve terse/compressed/
|
||||||
|
full update semantics, stale-update behavior, and parent-child linking.
|
||||||
|
- Parcel, estate, grid, terrain, sound, environment, interest-list, directory,
|
||||||
|
friends, groups, marketplace, and experience managers each get a transport-
|
||||||
|
independent state/model layer plus network handlers.
|
||||||
|
- Terrain codecs and GLTF/material handling use golden fixtures and size limits.
|
||||||
|
GLTF JSON may use Serde, but binary buffers/accessors require checked offset
|
||||||
|
arithmetic.
|
||||||
|
|
||||||
|
#### Archives and import/export
|
||||||
|
|
||||||
|
- `OarFile`, tar reader/writer, region settings, and asset archiver use `tar` and
|
||||||
|
`flate2` with path normalization, extraction-root enforcement, and size/count
|
||||||
|
limits.
|
||||||
|
- Collada/OBJ/GLTF import/export keeps format DTOs separate from world objects.
|
||||||
|
Deterministic output and round-trip fixtures are required; live upload is a
|
||||||
|
later layer.
|
||||||
|
|
||||||
|
#### Threading and utilities
|
||||||
|
|
||||||
|
- Replace custom events/semaphores/read-write locks with Tokio or `std::sync`
|
||||||
|
primitives where semantics match. Port custom optimistic/spin locks only if a
|
||||||
|
benchmark and correctness test show they are still required.
|
||||||
|
- Replace array pools with `Vec`/`Bytes` reuse first. Add pooling only after
|
||||||
|
profiling and with a bounded pool.
|
||||||
|
- Observable/event dictionaries expose change streams without executing user
|
||||||
|
callbacks while holding internal locks.
|
||||||
|
|
||||||
|
Completion gate for the core crate: no public core shim remains; all offline
|
||||||
|
parity tests pass; malformed-input fuzz targets do not panic; fake-server login,
|
||||||
|
caps, UDP, reconnect, and cancellation scenarios pass on all supported OSes.
|
||||||
|
|
||||||
|
### 5.7 Rendering crates
|
||||||
|
|
||||||
|
`libremetaverse-rendering-simple` ports `SimpleRenderer` first as the reference
|
||||||
|
implementation of the core rendering trait. It should favor clarity and serve
|
||||||
|
as a fixture generator.
|
||||||
|
|
||||||
|
`libremetaverse-rendering-mesh-foundry` then ports the complete MeshFoundry
|
||||||
|
pipeline using types, OSD, core assets, PrimMesher, and imaging. Preserve face
|
||||||
|
grouping, materials, transforms, skin weights, normals/tangents, texture
|
||||||
|
coordinates, and output ordering. Do not merge the two crates: users should be
|
||||||
|
able to choose the small renderer without the full mesh pipeline.
|
||||||
|
|
||||||
|
### 5.8 `libremetaverse-lsl-tools`
|
||||||
|
|
||||||
|
- Treat `Tools/` as the parser-generator implementation and `YYClass/` as
|
||||||
|
generated grammar output. Do not line-by-line port all generated classes.
|
||||||
|
- First translate lexer tokens, source locations, errors, comments, precedence,
|
||||||
|
grammar productions, and recovery behavior into compatibility tests.
|
||||||
|
- Re-express the grammar in LALRPOP only if it reproduces accepted/rejected
|
||||||
|
programs and diagnostic locations. Otherwise port the existing table machine
|
||||||
|
with generated Rust tables.
|
||||||
|
- Generated tables are committed and deterministically reproducible. Keep public
|
||||||
|
token/parser entry points recognizable for migration, while Rust iterators and
|
||||||
|
`Result` replace C# enumerators/exceptions.
|
||||||
|
|
||||||
|
Completion gate: all grammar fixtures and error-recovery cases match, and the
|
||||||
|
generated code is warning-free without 150 hand-maintained class shims.
|
||||||
|
|
||||||
|
### 5.9 `libremetaverse-rlv`
|
||||||
|
|
||||||
|
- Port message/command parsing and enums first, preserving case, separators,
|
||||||
|
attachment point aliases, option handling, and invalid-command errors.
|
||||||
|
- Port blacklist/provider/callback interfaces as narrow traits. Return typed
|
||||||
|
actions from pure parsing/decision code; execute viewer actions through an
|
||||||
|
injected callback adapter.
|
||||||
|
- Port restriction state, camera settings, shared folders, inventory maps,
|
||||||
|
locked folders, attachment requests, permissions, and service orchestration.
|
||||||
|
- Use immutable snapshots or short locks for restriction reads; callbacks run
|
||||||
|
after locks are released.
|
||||||
|
|
||||||
|
Completion gate: every RLV command/query/restriction/exception test case is a
|
||||||
|
semantic Rust test and all original expected error distinctions remain visible.
|
||||||
|
|
||||||
|
### 5.10 `libremetaverse-utilities`
|
||||||
|
|
||||||
|
Port the convenience functions only after their owning lower-level APIs exist.
|
||||||
|
Prefer free functions or extension traits with explicit client references. Do
|
||||||
|
not use this crate to bypass ownership, cancellation, or error handling in the
|
||||||
|
core crate.
|
||||||
|
|
||||||
|
### 5.11 Voice crates
|
||||||
|
|
||||||
|
For `libremetaverse-voice-vivox`:
|
||||||
|
|
||||||
|
- port XML/control definitions, account/session/participant models, TCP pipe,
|
||||||
|
connector, gateway, and manager as a protocol adapter;
|
||||||
|
- keep blocking compatibility APIs as thin wrappers in the program layer, not
|
||||||
|
library methods that create runtimes;
|
||||||
|
- Vivox SDK/server availability and licensing are external prerequisites. The
|
||||||
|
crate can be protocol-complete without shipping proprietary native binaries.
|
||||||
|
|
||||||
|
For `libremetaverse-voice-webrtc`:
|
||||||
|
|
||||||
|
- port signaling messages and data-channel framing before peer/media handling;
|
||||||
|
- adapt `webrtc`, `cpal`, and `opus` behind local traits so protocol tests do not
|
||||||
|
require audio hardware;
|
||||||
|
- make device selection, sample format/rate/channel conversion, mute, reconnect,
|
||||||
|
ICE/SDP negotiation, and teardown explicit state transitions;
|
||||||
|
- CI uses virtual/fake audio; real-device and live voice validation is a manual
|
||||||
|
gate on macOS, Linux, and Windows.
|
||||||
|
|
||||||
|
Completion gate: recorded signaling/data-channel fixtures pass offline, fake
|
||||||
|
audio round-trips have bounded latency/loss behavior, teardown leaves no tasks,
|
||||||
|
and opt-in live validation succeeds without logging tokens.
|
||||||
|
|
||||||
|
## 6. Test-first migration workflow
|
||||||
|
|
||||||
|
The compatibility suite is deliberately red in the shell stage. First finish
|
||||||
|
the complete signature gate in section 3.1 across all crates. Then translate the
|
||||||
|
complete suite in section 3.2 across all crates. Only after both global gates
|
||||||
|
may implementation proceed in dependency order.
|
||||||
|
|
||||||
|
For each generated test:
|
||||||
|
|
||||||
|
1. Open the exact C# source/line and verify its method-body SHA-256 still matches
|
||||||
|
`tests/upstream-tests.json`.
|
||||||
|
2. Identify setup, action, assertions, parameterized cases, fixtures, categories,
|
||||||
|
and intended exception/event/timeout behavior.
|
||||||
|
3. Replace only that Rust `pending(...)` body with semantically equivalent Rust.
|
||||||
|
Keep the generated Rust test name or update the ledger in the same change.
|
||||||
|
4. Port literal bytes, UUIDs, timestamps, tolerances, culture assumptions, and
|
||||||
|
ordering exactly. Do not weaken an assertion merely because the shim differs.
|
||||||
|
5. If the needed API is absent, stop and treat that as a signature-coverage
|
||||||
|
defect: add the missing catalog/mapping entry and final failing signature,
|
||||||
|
then rerun the 100% API coverage gate.
|
||||||
|
6. Keep the test red at the standardized unimplemented member boundary; do not
|
||||||
|
implement behavior during the test-translation stage.
|
||||||
|
7. Mark the JSON entry with a future `status: semantic` field only after review;
|
||||||
|
enhance the generator/checker to preserve those reviewed entries rather than
|
||||||
|
overwrite them.
|
||||||
|
|
||||||
|
Test translation rules:
|
||||||
|
|
||||||
|
- NUnit `[TestCase]` invocations remain separate Rust tests so failures identify
|
||||||
|
the exact case.
|
||||||
|
- `Assert.Throws` maps to matching a specific Rust error variant, not any error.
|
||||||
|
- floating assertions retain the original tolerance and NaN behavior.
|
||||||
|
- async tests use paused/injected time where possible; no arbitrary sleeps.
|
||||||
|
- Moq interaction tests prefer a small fake recording calls; use Mockall only
|
||||||
|
when a trait contract has many independent expectations.
|
||||||
|
- `RequiresLiveServer` tests become `#[ignore]` and require explicit grid URL,
|
||||||
|
first/last name, and secret environment variables. They never run in normal CI.
|
||||||
|
- benchmark-category methods move to Criterion and are removed from correctness
|
||||||
|
pass/fail counts.
|
||||||
|
- malformed wire/asset tests become fuzz seeds after direct parity is passing.
|
||||||
|
|
||||||
|
Required gates:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
cargo check --workspace --all-targets
|
||||||
|
cargo test --workspace --no-run
|
||||||
|
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||||
|
cargo doc --workspace --no-deps
|
||||||
|
```
|
||||||
|
|
||||||
|
During Stage 0, `cargo test --workspace` fails in generated parity placeholders.
|
||||||
|
During the full test-suite gate, `pending(` is the explicit remaining-work
|
||||||
|
count and CI prohibits increases. At the end of that gate, tests still fail,
|
||||||
|
but only because callable production signatures report standardized
|
||||||
|
not-implemented member IDs. During implementation, that failure inventory then
|
||||||
|
shrinks as behavior turns the fixed suite green.
|
||||||
|
|
||||||
|
## 7. Program and live-grid validation plan
|
||||||
|
|
||||||
|
The `programs` package contains these binary targets:
|
||||||
|
|
||||||
|
| Rust binary | C# project | Port purpose |
|
||||||
|
|---|---|---|
|
||||||
|
| `simple-bot` | `SimpleBot` | login, IM/chat events, movement and animations |
|
||||||
|
| `prim-inspector` | `PrimInspector` | object discovery/properties and transforms |
|
||||||
|
| `inventory-explorer` | `InventoryExplorer` | inventory fetch, search, stats and export |
|
||||||
|
| `packet-dump` | `PacketDump` | raw/decoded packet subscription and logging |
|
||||||
|
| `irc-gateway` | `IRCGateway` | concurrent external chat bridge |
|
||||||
|
| `test-client` | `TestClient` | full interactive client and all 128 command targets |
|
||||||
|
| `vivox-test` | `VivoxTest` | Vivox account/session/participant validation |
|
||||||
|
| `webrtc-test` | `WebRtcTest` | WebRTC signaling, devices and audio validation |
|
||||||
|
| `osd-inspector` | `OSDInspector` | offline LLSD inspect/convert/validate/primitive round trip |
|
||||||
|
|
||||||
|
Port `osd-inspector` first because it is offline and validates StructuredData.
|
||||||
|
Then port `simple-bot`, `packet-dump`, `prim-inspector`, and
|
||||||
|
`inventory-explorer` as vertical grid slices. Port TestClient commands by folder
|
||||||
|
(system/login first, then communication, inventory, objects, movement, land,
|
||||||
|
groups, friends, directory, appearance, voice, stats) while keeping
|
||||||
|
`commands::TEST_CLIENT_COMMANDS` as the completeness inventory. Voice programs
|
||||||
|
come last because they need native/device and service prerequisites.
|
||||||
|
|
||||||
|
Live validation must use a dedicated test account and an explicitly supplied
|
||||||
|
grid URI. Secrets are read from environment variables or the OS secret store,
|
||||||
|
never source/config committed to Git. A live smoke run records sanitized:
|
||||||
|
|
||||||
|
- server/grid/version and Rust commit;
|
||||||
|
- login and initial simulator/capabilities completion;
|
||||||
|
- IM/chat send/receive;
|
||||||
|
- movement/teleport/region crossing;
|
||||||
|
- inventory fetch and one reversible test-folder operation;
|
||||||
|
- object discovery/property request;
|
||||||
|
- asset/texture download and decode;
|
||||||
|
- clean logout and task/socket teardown.
|
||||||
|
|
||||||
|
Operations that spend currency, modify estate/parcel state, upload assets,
|
||||||
|
delete inventory, or affect other users require separate opt-in flags and are
|
||||||
|
not part of the default smoke test.
|
||||||
|
|
||||||
|
## 8. Ordered delivery milestones
|
||||||
|
|
||||||
|
1. **Structural inventory shell (current Stage 0):** crates, type/declaration
|
||||||
|
ledgers, failing test parity entries, program targets, license, and this plan
|
||||||
|
compile. This is not the callable API or semantic test suite.
|
||||||
|
2. **Full public API signature shim:** extract authoritative compiled metadata,
|
||||||
|
map 100% of public members to reviewed Rust signatures, and implement only
|
||||||
|
standardized failing bodies. All signatures and downstream compile fixtures
|
||||||
|
build before test translation begins.
|
||||||
|
3. **Full semantic test translation:** replace all 1,295 `pending` cases with
|
||||||
|
exact reviewed Rust equivalents using the public shim. The entire suite
|
||||||
|
compiles and fails only at standardized unimplemented member boundaries.
|
||||||
|
4. **Types implementation:** UUID, math, enums, conversions, collections,
|
||||||
|
cache/token bucket; turn only the already-existing Types tests green.
|
||||||
|
5. **StructuredData implementation:** OSD plus binary/notation/XML/JSON/protobuf
|
||||||
|
compatibility; turn only the already-existing StructuredData tests green.
|
||||||
|
6. **Imaging and PrimMesher implementation:** managed images, codec trait,
|
||||||
|
TGA/J2K adapter,
|
||||||
|
extrusion/sculpt/OBJ and rendering tests.
|
||||||
|
7. **Wire codegen:** deterministic Rust packet/visual/skeleton/tree/genepool/
|
||||||
|
attention generation and golden packet bytes.
|
||||||
|
8. **Networking/client lifecycle:** UDP, caps, login, simulators, settings,
|
||||||
|
cancellation, reconnect and logout against fake servers.
|
||||||
|
9. **World vertical slices:** agent, inventory, assets/appearance, objects,
|
||||||
|
parcels/terrain/environment, social/directory/groups, marketplace/estate.
|
||||||
|
10. **Rendering, RLV, LSL tools:** implement against their already-translated
|
||||||
|
suites and add public migration docs.
|
||||||
|
11. **Programs/live grid:** offline inspector, four core examples, TestClient,
|
||||||
|
then voice adapters and opt-in live/device validation.
|
||||||
|
12. **Hardening/release:** fuzz untrusted parsers, cross-platform native CI,
|
||||||
|
MSRV, docs/examples, semver/API audit, license/asset audit, performance
|
||||||
|
comparison against the separately run pinned C# implementation, and an
|
||||||
|
artifact/dependency audit proving there is no CLR, .NET assembly, subprocess,
|
||||||
|
RPC, or LibreMetaverse foreign-interface dependency.
|
||||||
|
|
||||||
|
Each milestone ends with zero unreviewed generated shims in its owned modules,
|
||||||
|
no weakened parity assertions, formatted/clippy-clean code, public Rust docs
|
||||||
|
that cite the corresponding C# concept, and a refreshed completeness report
|
||||||
|
from the checked-in ledgers.
|
||||||
12196
api/SURFACE.tsv
Normal file
12196
api/SURFACE.tsv
Normal file
File diff suppressed because it is too large
Load Diff
1706
api/TYPES.tsv
Normal file
1706
api/TYPES.tsv
Normal file
File diff suppressed because it is too large
Load Diff
14
crates/libremetaverse-imaging-skia/Cargo.toml
Normal file
14
crates/libremetaverse-imaging-skia/Cargo.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-imaging-skia"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Skia codec shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse-imaging = { path = "../libremetaverse-imaging" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
11
crates/libremetaverse-imaging-skia/src/generated.rs
Normal file
11
crates/libremetaverse-imaging-skia/src/generated.rs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Imaging.Skia.SkiaTextureCodec`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SkiaTextureCodec;
|
||||||
|
impl SkiaTextureCodec {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Imaging.Skia.SkiaTextureCodec";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
6
crates/libremetaverse-imaging-skia/src/lib.rs
Normal file
6
crates/libremetaverse-imaging-skia/src/lib.rs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
//! Skia imaging adapter corresponding to `LibreMetaverse.Imaging.Skia`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse_imaging as imaging;
|
||||||
11
crates/libremetaverse-imaging/Cargo.toml
Normal file
11
crates/libremetaverse-imaging/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-imaging"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Texture codec abstractions for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
24
crates/libremetaverse-imaging/src/generated.rs
Normal file
24
crates/libremetaverse-imaging/src/generated.rs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// Shim for C# `LibreMetaverse.Imaging.ITextureCodec`.
|
||||||
|
pub trait ITextureCodec {
|
||||||
|
const CSHARP_NAME: &'static str = "LibreMetaverse.Imaging.ITextureCodec";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Imaging.ImageChannels`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ImageChannels;
|
||||||
|
impl ImageChannels {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Imaging.ImageChannels";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Imaging.ManagedImage`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ManagedImage;
|
||||||
|
impl ManagedImage {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Imaging.ManagedImage";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
5
crates/libremetaverse-imaging/src/lib.rs
Normal file
5
crates/libremetaverse-imaging/src/lib.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
//! Imaging abstractions corresponding to `LibreMetaverse.Imaging.Abstractions`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
11
crates/libremetaverse-lsl-tools/Cargo.toml
Normal file
11
crates/libremetaverse-lsl-tools/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-lsl-tools"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "LSL parser-tool shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
1291
crates/libremetaverse-lsl-tools/src/generated.rs
Normal file
1291
crates/libremetaverse-lsl-tools/src/generated.rs
Normal file
File diff suppressed because it is too large
Load Diff
5
crates/libremetaverse-lsl-tools/src/lib.rs
Normal file
5
crates/libremetaverse-lsl-tools/src/lib.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
//! LSL parsing tools corresponding to `LibreMetaverse.LslTools`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
14
crates/libremetaverse-prim-mesher/Cargo.toml
Normal file
14
crates/libremetaverse-prim-mesher/Cargo.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-prim-mesher"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Primitive meshing shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse-imaging = { path = "../libremetaverse-imaging" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
139
crates/libremetaverse-prim-mesher/src/generated.rs
Normal file
139
crates/libremetaverse-prim-mesher/src/generated.rs
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.Coord`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Coord;
|
||||||
|
impl Coord {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.Coord";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.Face`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Face;
|
||||||
|
impl Face {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.Face";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.ObjMesh`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ObjMesh;
|
||||||
|
impl ObjMesh {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.ObjMesh";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.Path`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Path;
|
||||||
|
impl Path {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.Path";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.PathNode`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PathNode;
|
||||||
|
impl PathNode {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.PathNode";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PrimMesher.PathType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PathType;
|
||||||
|
impl PathType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.PathType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.PrimMesh`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PrimMesh;
|
||||||
|
impl PrimMesh {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.PrimMesh";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.Profile`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Profile;
|
||||||
|
impl Profile {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.Profile";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.Quat`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Quat;
|
||||||
|
impl Quat {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.Quat";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.SculptMap`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SculptMap;
|
||||||
|
impl SculptMap {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.SculptMap";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.SculptMesh`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SculptMesh;
|
||||||
|
impl SculptMesh {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.SculptMesh";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PrimMesher.SculptType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SculptType;
|
||||||
|
impl SculptType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.SculptType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.UVCoord`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct UVCoord;
|
||||||
|
impl UVCoord {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.UVCoord";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.PrimMesher.VertexIndexer`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VertexIndexer;
|
||||||
|
impl VertexIndexer {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.VertexIndexer";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.ViewerFace`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ViewerFace;
|
||||||
|
impl ViewerFace {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.ViewerFace";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.ViewerPolygon`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ViewerPolygon;
|
||||||
|
impl ViewerPolygon {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.ViewerPolygon";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.PrimMesher.ViewerVertex`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ViewerVertex;
|
||||||
|
impl ViewerVertex {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimMesher.ViewerVertex";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
6
crates/libremetaverse-prim-mesher/src/lib.rs
Normal file
6
crates/libremetaverse-prim-mesher/src/lib.rs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
//! Primitive mesher corresponding to `LibreMetaverse.PrimMesher`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse_imaging as imaging;
|
||||||
18
crates/libremetaverse-rendering-mesh-foundry/Cargo.toml
Normal file
18
crates/libremetaverse-rendering-mesh-foundry/Cargo.toml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-rendering-mesh-foundry"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "MeshFoundry renderer shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../libremetaverse" }
|
||||||
|
libremetaverse-imaging = { path = "../libremetaverse-imaging" }
|
||||||
|
libremetaverse-prim-mesher = { path = "../libremetaverse-prim-mesher" }
|
||||||
|
libremetaverse-structured-data = { path = "../libremetaverse-structured-data" }
|
||||||
|
libremetaverse-types = { path = "../libremetaverse-types" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Rendering.MeshFoundry`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct MeshFoundry;
|
||||||
|
impl MeshFoundry {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Rendering.MeshFoundry";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
10
crates/libremetaverse-rendering-mesh-foundry/src/lib.rs
Normal file
10
crates/libremetaverse-rendering-mesh-foundry/src/lib.rs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
//! MeshFoundry renderer corresponding to `LibreMetaverse.Rendering.MeshFoundry`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse as core;
|
||||||
|
pub use libremetaverse_imaging as imaging;
|
||||||
|
pub use libremetaverse_prim_mesher as prim_mesher;
|
||||||
|
pub use libremetaverse_structured_data as structured_data;
|
||||||
|
pub use libremetaverse_types as types;
|
||||||
15
crates/libremetaverse-rendering-simple/Cargo.toml
Normal file
15
crates/libremetaverse-rendering-simple/Cargo.toml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-rendering-simple"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Simple renderer shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../libremetaverse" }
|
||||||
|
libremetaverse-types = { path = "../libremetaverse-types" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
11
crates/libremetaverse-rendering-simple/src/generated.rs
Normal file
11
crates/libremetaverse-rendering-simple/src/generated.rs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Rendering.SimpleRenderer`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SimpleRenderer;
|
||||||
|
impl SimpleRenderer {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Rendering.SimpleRenderer";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
7
crates/libremetaverse-rendering-simple/src/lib.rs
Normal file
7
crates/libremetaverse-rendering-simple/src/lib.rs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
//! Simple renderer corresponding to `LibreMetaverse.Rendering.Simple`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse as core;
|
||||||
|
pub use libremetaverse_types as types;
|
||||||
11
crates/libremetaverse-rlv/Cargo.toml
Normal file
11
crates/libremetaverse-rlv/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-rlv"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "RLV protocol shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
224
crates/libremetaverse-rlv/src/generated.rs
Normal file
224
crates/libremetaverse-rlv/src/generated.rs
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.AttachmentRequest`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AttachmentRequest;
|
||||||
|
impl AttachmentRequest {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.AttachmentRequest";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.CameraRestrictions`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct CameraRestrictions;
|
||||||
|
impl CameraRestrictions {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.CameraRestrictions";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.CameraSettings`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct CameraSettings;
|
||||||
|
impl CameraSettings {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.CameraSettings";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.HoverTextLocation`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct HoverTextLocation;
|
||||||
|
impl HoverTextLocation {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.HoverTextLocation";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shim for C# `LibreMetaverse.RLV.IRlvActionCallbacks`.
|
||||||
|
pub trait IRlvActionCallbacks {
|
||||||
|
const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.IRlvActionCallbacks";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shim for C# `LibreMetaverse.RLV.IRlvQueryCallbacks`.
|
||||||
|
pub trait IRlvQueryCallbacks {
|
||||||
|
const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.IRlvQueryCallbacks";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.InventoryMap`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct InventoryMap;
|
||||||
|
impl InventoryMap {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.InventoryMap";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.LockedFolderPublic`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct LockedFolderPublic;
|
||||||
|
impl LockedFolderPublic {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.LockedFolderPublic";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.ObjectLocation`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ObjectLocation;
|
||||||
|
impl ObjectLocation {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.ObjectLocation";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvActionCallbacksDefault`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvActionCallbacksDefault;
|
||||||
|
impl RlvActionCallbacksDefault {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvActionCallbacksDefault";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.RlvAttachmentPoint`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvAttachmentPoint;
|
||||||
|
impl RlvAttachmentPoint {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvAttachmentPoint";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvBlacklist`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvBlacklist;
|
||||||
|
impl RlvBlacklist {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvBlacklist";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvCallbacksDefault`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvCallbacksDefault;
|
||||||
|
impl RlvCallbacksDefault {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvCallbacksDefault";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvCommandProcessor`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvCommandProcessor;
|
||||||
|
impl RlvCommandProcessor {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvCommandProcessor";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvCommon`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvCommon;
|
||||||
|
impl RlvCommon {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvCommon";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.RlvGestureState`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvGestureState;
|
||||||
|
impl RlvGestureState {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvGestureState";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.RlvGetDebugType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvGetDebugType;
|
||||||
|
impl RlvGetDebugType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvGetDebugType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.RlvGetEnvType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvGetEnvType;
|
||||||
|
impl RlvGetEnvType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvGetEnvType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvInventoryItem`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvInventoryItem;
|
||||||
|
impl RlvInventoryItem {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvInventoryItem";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvPermissionsService`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvPermissionsService;
|
||||||
|
impl RlvPermissionsService {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvPermissionsService";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvRestriction`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvRestriction;
|
||||||
|
impl RlvRestriction {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvRestriction";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvRestrictionManager`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvRestrictionManager;
|
||||||
|
impl RlvRestrictionManager {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvRestrictionManager";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.RlvRestrictionType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvRestrictionType;
|
||||||
|
impl RlvRestrictionType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvRestrictionType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvService`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvService;
|
||||||
|
impl RlvService {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvService";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.RlvSharedFolder`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvSharedFolder;
|
||||||
|
impl RlvSharedFolder {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvSharedFolder";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.RlvWearableType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RlvWearableType;
|
||||||
|
impl RlvWearableType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.RlvWearableType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.RLV.TouchLocation`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct TouchLocation;
|
||||||
|
impl TouchLocation {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.RLV.TouchLocation";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod event_arguments {
|
||||||
|
/// `class` shim for C# `LibreMetaverse.RLV.EventArguments.RestrictionUpdatedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RestrictionUpdatedEventArgs;
|
||||||
|
impl RestrictionUpdatedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str =
|
||||||
|
"LibreMetaverse.RLV.EventArguments.RestrictionUpdatedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
}
|
||||||
5
crates/libremetaverse-rlv/src/lib.rs
Normal file
5
crates/libremetaverse-rlv/src/lib.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
//! Restrained Love Viewer support corresponding to `LibreMetaverse.RLV`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
14
crates/libremetaverse-structured-data/Cargo.toml
Normal file
14
crates/libremetaverse-structured-data/Cargo.toml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-structured-data"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "OSD and LLSD shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse-types = { path = "../libremetaverse-types" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
131
crates/libremetaverse-structured-data/src/generated.rs
Normal file
131
crates/libremetaverse-structured-data/src/generated.rs
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSD`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSD;
|
||||||
|
impl OSD {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSD";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDArray`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDArray;
|
||||||
|
impl OSDArray {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDArray";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDBinary`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDBinary;
|
||||||
|
impl OSDBinary {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDBinary";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDBoolean`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDBoolean;
|
||||||
|
impl OSDBoolean {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDBoolean";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDDate`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDDate;
|
||||||
|
impl OSDDate {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDDate";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDException`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDException;
|
||||||
|
impl OSDException {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDException";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.StructuredData.OSDFormat`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDFormat;
|
||||||
|
impl OSDFormat {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDFormat";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDInteger`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDInteger;
|
||||||
|
impl OSDInteger {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDInteger";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDLlsdXml`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDLlsdXml;
|
||||||
|
impl OSDLlsdXml {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDLlsdXml";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDMap`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDMap;
|
||||||
|
impl OSDMap {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDMap";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDParser`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDParser;
|
||||||
|
impl OSDParser {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDParser";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDReal`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDReal;
|
||||||
|
impl OSDReal {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDReal";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDString`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDString;
|
||||||
|
impl OSDString {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDString";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.StructuredData.OSDType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDType;
|
||||||
|
impl OSDType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDUUID`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDUUID;
|
||||||
|
impl OSDUUID {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDUUID";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.StructuredData.OSDUri`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OSDUri;
|
||||||
|
impl OSDUri {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.StructuredData.OSDUri";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
6
crates/libremetaverse-structured-data/src/lib.rs
Normal file
6
crates/libremetaverse-structured-data/src/lib.rs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
//! Structured-data types corresponding to `LibreMetaverse.StructuredData`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse_types as types;
|
||||||
11
crates/libremetaverse-types/Cargo.toml
Normal file
11
crates/libremetaverse-types/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-types"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Core value-type shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
360
crates/libremetaverse-types/src/generated.rs
Normal file
360
crates/libremetaverse-types/src/generated.rs
Normal file
@@ -0,0 +1,360 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.AssetType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AssetType;
|
||||||
|
impl AssetType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.AssetType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.AttachmentPoint`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AttachmentPoint;
|
||||||
|
impl AttachmentPoint {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.AttachmentPoint";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.CRC32`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct CRC32;
|
||||||
|
impl CRC32 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.CRC32";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.CacheDictionary`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct CacheDictionary<T0 = (), T1 = ()>(std::marker::PhantomData<(T0, T1)>);
|
||||||
|
impl<T0, T1> CacheDictionary<T0, T1> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.CacheDictionary";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.CacheDictionaryEnumerator`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct CacheDictionaryEnumerator;
|
||||||
|
impl CacheDictionaryEnumerator {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.CacheDictionaryEnumerator";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.ClickAction`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ClickAction;
|
||||||
|
impl ClickAction {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.ClickAction";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Color4`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Color4;
|
||||||
|
impl Color4 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Color4";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.DoubleDictionary`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct DoubleDictionary<T0 = (), T1 = (), T2 = ()>(std::marker::PhantomData<(T0, T1, T2)>);
|
||||||
|
impl<T0, T1, T2> DoubleDictionary<T0, T1, T2> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.DoubleDictionary";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.EmptyRemovalStrategy`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct EmptyRemovalStrategy<T0 = ()>(std::marker::PhantomData<(T0,)>);
|
||||||
|
impl<T0> EmptyRemovalStrategy<T0> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.EmptyRemovalStrategy";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.EnumInfoAttribute`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct EnumInfoAttribute;
|
||||||
|
impl EnumInfoAttribute {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.EnumInfoAttribute";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.EnumInfoExtensions`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct EnumInfoExtensions;
|
||||||
|
impl EnumInfoExtensions {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.EnumInfoExtensions";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.ExpiringCache`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ExpiringCache<T0 = (), T1 = ()>(std::marker::PhantomData<(T0, T1)>);
|
||||||
|
impl<T0, T1> ExpiringCache<T0, T1> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.ExpiringCache";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.ExtraParamType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ExtraParamType;
|
||||||
|
impl ExtraParamType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.ExtraParamType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.FaceType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct FaceType;
|
||||||
|
impl FaceType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.FaceType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.FolderType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct FolderType;
|
||||||
|
impl FolderType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.FolderType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.HoleType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct HoleType;
|
||||||
|
impl HoleType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.HoleType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shim for C# `LibreMetaverse.ICacheDictionaryRemovalStrategy`.
|
||||||
|
pub trait ICacheDictionaryRemovalStrategy<T0 = ()> {
|
||||||
|
const CSHARP_NAME: &'static str = "LibreMetaverse.ICacheDictionaryRemovalStrategy";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.InventoryType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct InventoryType;
|
||||||
|
impl InventoryType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.InventoryType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.JointType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct JointType;
|
||||||
|
impl JointType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.JointType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.LruRemovalStrategy`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct LruRemovalStrategy<T0 = ()>(std::marker::PhantomData<(T0,)>);
|
||||||
|
impl<T0> LruRemovalStrategy<T0> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.LruRemovalStrategy";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Material`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Material;
|
||||||
|
impl Material {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Material";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Matrix4`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Matrix4;
|
||||||
|
impl Matrix4 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Matrix4";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.MruRemovalStrategy`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct MruRemovalStrategy<T0 = ()>(std::marker::PhantomData<(T0,)>);
|
||||||
|
impl<T0> MruRemovalStrategy<T0> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.MruRemovalStrategy";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.MultiValueDictionary`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct MultiValueDictionary<T0 = (), T1 = ()>(std::marker::PhantomData<(T0, T1)>);
|
||||||
|
impl<T0, T1> MultiValueDictionary<T0, T1> {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.MultiValueDictionary";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.ObjectCategory`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ObjectCategory;
|
||||||
|
impl ObjectCategory {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.ObjectCategory";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PCode`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PCode;
|
||||||
|
impl PCode {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PCode";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PathCurve`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PathCurve;
|
||||||
|
impl PathCurve {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PathCurve";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PhysicsShapeType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PhysicsShapeType;
|
||||||
|
impl PhysicsShapeType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PhysicsShapeType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Platform`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Platform;
|
||||||
|
impl Platform {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Platform";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PrimFlags`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PrimFlags;
|
||||||
|
impl PrimFlags {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimFlags";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.PrimType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PrimType;
|
||||||
|
impl PrimType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.PrimType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.ProfileCurve`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ProfileCurve;
|
||||||
|
impl ProfileCurve {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.ProfileCurve";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Quaternion`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Quaternion;
|
||||||
|
impl Quaternion {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Quaternion";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Ray`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Ray;
|
||||||
|
impl Ray {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Ray";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.SaleType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SaleType;
|
||||||
|
impl SaleType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.SaleType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.SculptType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SculptType;
|
||||||
|
impl SculptType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.SculptType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.SoundFlags`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SoundFlags;
|
||||||
|
impl SoundFlags {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.SoundFlags";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.TokenBucket`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct TokenBucket;
|
||||||
|
impl TokenBucket {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.TokenBucket";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `record struct` shim for C# `LibreMetaverse.UUID`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct UUID;
|
||||||
|
impl UUID {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.UUID";
|
||||||
|
pub const CSHARP_KIND: &'static str = "record_struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Utils`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Utils;
|
||||||
|
impl Utils {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utils";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Vector2`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Vector2;
|
||||||
|
impl Vector2 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Vector2";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Vector3`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Vector3;
|
||||||
|
impl Vector3 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Vector3";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Vector3d`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Vector3d;
|
||||||
|
impl Vector3d {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Vector3d";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Vector4`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Vector4;
|
||||||
|
impl Vector4 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Vector4";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.WearableType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct WearableType;
|
||||||
|
impl WearableType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.WearableType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
5
crates/libremetaverse-types/src/lib.rs
Normal file
5
crates/libremetaverse-types/src/lib.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
//! Core value types corresponding to `LibreMetaverse.Types`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
16
crates/libremetaverse-utilities/Cargo.toml
Normal file
16
crates/libremetaverse-utilities/Cargo.toml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-utilities"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Utility shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../libremetaverse" }
|
||||||
|
libremetaverse-structured-data = { path = "../libremetaverse-structured-data" }
|
||||||
|
libremetaverse-types = { path = "../libremetaverse-types" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
27
crates/libremetaverse-utilities/src/generated.rs
Normal file
27
crates/libremetaverse-utilities/src/generated.rs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Utilities.ConnectionManager`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ConnectionManager;
|
||||||
|
impl ConnectionManager {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utilities.ConnectionManager";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Utilities.Realism`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Realism;
|
||||||
|
impl Realism {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utilities.Realism";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Utilities.WaterType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct WaterType;
|
||||||
|
impl WaterType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Utilities.WaterType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
8
crates/libremetaverse-utilities/src/lib.rs
Normal file
8
crates/libremetaverse-utilities/src/lib.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//! Utilities corresponding to `LibreMetaverse.Utilities`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse as core;
|
||||||
|
pub use libremetaverse_structured_data as structured_data;
|
||||||
|
pub use libremetaverse_types as types;
|
||||||
16
crates/libremetaverse-voice-vivox/Cargo.toml
Normal file
16
crates/libremetaverse-voice-vivox/Cargo.toml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-voice-vivox"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Vivox voice shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../libremetaverse" }
|
||||||
|
libremetaverse-structured-data = { path = "../libremetaverse-structured-data" }
|
||||||
|
libremetaverse-types = { path = "../libremetaverse-types" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
342
crates/libremetaverse-voice-vivox/src/generated.rs
Normal file
342
crates/libremetaverse-voice-vivox/src/generated.rs
Normal file
@@ -0,0 +1,342 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.AccountLoginStateChangeEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AccountLoginStateChangeEventArgs;
|
||||||
|
impl AccountLoginStateChangeEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str =
|
||||||
|
"LibreMetaverse.Voice.Vivox.AccountLoginStateChangeEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.AudioPropertiesEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AudioPropertiesEventArgs;
|
||||||
|
impl AudioPropertiesEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.AudioPropertiesEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.CaptureDevice`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct CaptureDevice;
|
||||||
|
impl CaptureDevice {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.CaptureDevice";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.ConnectionState`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ConnectionState;
|
||||||
|
impl ConnectionState {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ConnectionState";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.LoginState`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct LoginState;
|
||||||
|
impl LoginState {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.LoginState";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.NewSessionEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct NewSessionEventArgs;
|
||||||
|
impl NewSessionEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.NewSessionEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantAddedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantAddedEventArgs;
|
||||||
|
impl ParticipantAddedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ParticipantAddedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantPropertiesEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantPropertiesEventArgs;
|
||||||
|
impl ParticipantPropertiesEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str =
|
||||||
|
"LibreMetaverse.Voice.Vivox.ParticipantPropertiesEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantRemovedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantRemovedEventArgs;
|
||||||
|
impl ParticipantRemovedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ParticipantRemovedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantState`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantState;
|
||||||
|
impl ParticipantState {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ParticipantState";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantStateChangeEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantStateChangeEventArgs;
|
||||||
|
impl ParticipantStateChangeEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str =
|
||||||
|
"LibreMetaverse.Voice.Vivox.ParticipantStateChangeEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantType;
|
||||||
|
impl ParticipantType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ParticipantType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.ParticipantUpdatedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ParticipantUpdatedEventArgs;
|
||||||
|
impl ParticipantUpdatedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ParticipantUpdatedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.RenderDevice`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RenderDevice;
|
||||||
|
impl RenderDevice {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.RenderDevice";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.ResponseType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ResponseType;
|
||||||
|
impl ResponseType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.ResponseType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.SessionAddedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionAddedEventArgs;
|
||||||
|
impl SessionAddedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionAddedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.SessionGroupAddedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionGroupAddedEventArgs;
|
||||||
|
impl SessionGroupAddedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionGroupAddedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.SessionMediaEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionMediaEventArgs;
|
||||||
|
impl SessionMediaEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionMediaEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.SessionRemovedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionRemovedEventArgs;
|
||||||
|
impl SessionRemovedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionRemovedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.SessionState`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionState;
|
||||||
|
impl SessionState {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionState";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.SessionStateChangeEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionStateChangeEventArgs;
|
||||||
|
impl SessionStateChangeEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionStateChangeEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.SessionUpdatedEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct SessionUpdatedEventArgs;
|
||||||
|
impl SessionUpdatedEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.SessionUpdatedEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.TCPPipe`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct TCPPipe;
|
||||||
|
impl TCPPipe {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.TCPPipe";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceAccountEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceAccountEventArgs;
|
||||||
|
impl VoiceAccountEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceAccountEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceConnectorEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceConnectorEventArgs;
|
||||||
|
impl VoiceConnectorEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceConnectorEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceDevicesEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceDevicesEventArgs;
|
||||||
|
impl VoiceDevicesEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceDevicesEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceEvent`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceEvent;
|
||||||
|
impl VoiceEvent {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceEvent";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceGateway`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceGateway;
|
||||||
|
impl VoiceGateway {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceGateway";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceInputXml`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceInputXml;
|
||||||
|
impl VoiceInputXml {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceInputXml";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceLoggingSettings`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceLoggingSettings;
|
||||||
|
impl VoiceLoggingSettings {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceLoggingSettings";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceManager`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceManager;
|
||||||
|
impl VoiceManager {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceManager";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceParticipant`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceParticipant;
|
||||||
|
impl VoiceParticipant {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceParticipant";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoicePosition`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoicePosition;
|
||||||
|
impl VoicePosition {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoicePosition";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceRequest`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceRequest;
|
||||||
|
impl VoiceRequest {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceRequest";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceResponse`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceResponse;
|
||||||
|
impl VoiceResponse {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceResponse";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceResponseEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceResponseEventArgs;
|
||||||
|
impl VoiceResponseEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceResponseEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceResponseResults`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceResponseResults;
|
||||||
|
impl VoiceResponseResults {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceResponseResults";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.VoiceServiceType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceServiceType;
|
||||||
|
impl VoiceServiceType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceServiceType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceSession`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceSession;
|
||||||
|
impl VoiceSession {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceSession";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.Vivox.VoiceSessionEventArgs`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceSessionEventArgs;
|
||||||
|
impl VoiceSessionEventArgs {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceSessionEventArgs";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.Vivox.VoiceStatus`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceStatus;
|
||||||
|
impl VoiceStatus {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.VoiceStatus";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `delegate` shim for C# `LibreMetaverse.Voice.Vivox.void`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct void;
|
||||||
|
impl void {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.Vivox.void";
|
||||||
|
pub const CSHARP_KIND: &'static str = "delegate";
|
||||||
|
}
|
||||||
8
crates/libremetaverse-voice-vivox/src/lib.rs
Normal file
8
crates/libremetaverse-voice-vivox/src/lib.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
//! Vivox adapter corresponding to `LibreMetaverse.Voice.Vivox`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse as core;
|
||||||
|
pub use libremetaverse_structured_data as structured_data;
|
||||||
|
pub use libremetaverse_types as types;
|
||||||
15
crates/libremetaverse-voice-webrtc/Cargo.toml
Normal file
15
crates/libremetaverse-voice-webrtc/Cargo.toml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-voice-webrtc"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "WebRTC voice shims for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../libremetaverse" }
|
||||||
|
libremetaverse-structured-data = { path = "../libremetaverse-structured-data" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
106
crates/libremetaverse-voice-webrtc/src/generated.rs
Normal file
106
crates/libremetaverse-voice-webrtc/src/generated.rs
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.AvatarPosition`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AvatarPosition;
|
||||||
|
impl AvatarPosition {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.AvatarPosition";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `enum` shim for C# `LibreMetaverse.Voice.WebRTC.ESessionType`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct ESessionType;
|
||||||
|
impl ESessionType {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.ESessionType";
|
||||||
|
pub const CSHARP_KIND: &'static str = "enum";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shim for C# `LibreMetaverse.Voice.WebRTC.IVoiceLogger`.
|
||||||
|
pub trait IVoiceLogger {
|
||||||
|
const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.IVoiceLogger";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Voice.WebRTC.Int3`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Int3;
|
||||||
|
impl Int3 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.Int3";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `struct` shim for C# `LibreMetaverse.Voice.WebRTC.Int4`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Int4;
|
||||||
|
impl Int4 {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.Int4";
|
||||||
|
pub const CSHARP_KIND: &'static str = "struct";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.LibreMetaverseVoiceLogger`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct LibreMetaverseVoiceLogger;
|
||||||
|
impl LibreMetaverseVoiceLogger {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.LibreMetaverseVoiceLogger";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.OpusDecoderContext`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OpusDecoderContext;
|
||||||
|
impl OpusDecoderContext {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.OpusDecoderContext";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.PeerAudioState`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PeerAudioState;
|
||||||
|
impl PeerAudioState {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.PeerAudioState";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.PeerManager`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct PeerManager;
|
||||||
|
impl PeerManager {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.PeerManager";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.VoiceException`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceException;
|
||||||
|
impl VoiceException {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.VoiceException";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.VoiceManager`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceManager;
|
||||||
|
impl VoiceManager {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.VoiceManager";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `class` shim for C# `LibreMetaverse.Voice.WebRTC.VoiceSession`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct VoiceSession;
|
||||||
|
impl VoiceSession {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.Voice.WebRTC.VoiceSession";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod libre_metaverse {
|
||||||
|
/// `class` shim for C# `LibreMetaverse.AudioDevice`; members remain intentionally unimplemented.
|
||||||
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
|
||||||
|
pub struct AudioDevice;
|
||||||
|
impl AudioDevice {
|
||||||
|
pub const CSHARP_NAME: &'static str = "LibreMetaverse.AudioDevice";
|
||||||
|
pub const CSHARP_KIND: &'static str = "class";
|
||||||
|
}
|
||||||
|
}
|
||||||
7
crates/libremetaverse-voice-webrtc/src/lib.rs
Normal file
7
crates/libremetaverse-voice-webrtc/src/lib.rs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
//! WebRTC voice adapter corresponding to `LibreMetaverse.Voice.WebRTC`.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse as core;
|
||||||
|
pub use libremetaverse_structured_data as structured_data;
|
||||||
16
crates/libremetaverse/Cargo.toml
Normal file
16
crates/libremetaverse/Cargo.toml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
description = "Rust rewrite shell for the LibreMetaverse client library"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse-imaging = { path = "../libremetaverse-imaging" }
|
||||||
|
libremetaverse-structured-data = { path = "../libremetaverse-structured-data" }
|
||||||
|
libremetaverse-types = { path = "../libremetaverse-types" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
10678
crates/libremetaverse/src/generated.rs
Normal file
10678
crates/libremetaverse/src/generated.rs
Normal file
File diff suppressed because it is too large
Load Diff
20
crates/libremetaverse/src/lib.rs
Normal file
20
crates/libremetaverse/src/lib.rs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//! Public rewrite shell corresponding to the main `LibreMetaverse` assembly.
|
||||||
|
|
||||||
|
mod generated;
|
||||||
|
|
||||||
|
pub use generated::*;
|
||||||
|
pub use libremetaverse_imaging as imaging_abstractions;
|
||||||
|
pub use libremetaverse_structured_data as structured_data;
|
||||||
|
pub use libremetaverse_types as types;
|
||||||
|
|
||||||
|
/// Common behavior for program shims while the network stack is unimplemented.
|
||||||
|
pub mod shim {
|
||||||
|
use std::process::ExitCode;
|
||||||
|
|
||||||
|
/// Reports that an upstream sample has a target but no implementation yet.
|
||||||
|
#[must_use]
|
||||||
|
pub fn pending_program(name: &str) -> ExitCode {
|
||||||
|
eprintln!("{name}: LibreMetaverse Rust port is not implemented yet");
|
||||||
|
ExitCode::FAILURE
|
||||||
|
}
|
||||||
|
}
|
||||||
52
programs/Cargo.toml
Normal file
52
programs/Cargo.toml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-programs"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../crates/libremetaverse" }
|
||||||
|
libremetaverse-imaging-skia = { path = "../crates/libremetaverse-imaging-skia" }
|
||||||
|
libremetaverse-voice-vivox = { path = "../crates/libremetaverse-voice-vivox" }
|
||||||
|
libremetaverse-voice-webrtc = { path = "../crates/libremetaverse-voice-webrtc" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "irc-gateway"
|
||||||
|
path = "src/bin/irc_gateway.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "inventory-explorer"
|
||||||
|
path = "src/bin/inventory_explorer.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "packet-dump"
|
||||||
|
path = "src/bin/packet_dump.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "prim-inspector"
|
||||||
|
path = "src/bin/prim_inspector.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "simple-bot"
|
||||||
|
path = "src/bin/simple_bot.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "test-client"
|
||||||
|
path = "src/bin/test_client.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "vivox-test"
|
||||||
|
path = "src/bin/vivox_test.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "webrtc-test"
|
||||||
|
path = "src/bin/webrtc_test.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "osd-inspector"
|
||||||
|
path = "src/bin/osd_inspector.rs"
|
||||||
3
programs/src/bin/inventory_explorer.rs
Normal file
3
programs/src/bin/inventory_explorer.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("InventoryExplorer")
|
||||||
|
}
|
||||||
3
programs/src/bin/irc_gateway.rs
Normal file
3
programs/src/bin/irc_gateway.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("IRCGateway")
|
||||||
|
}
|
||||||
3
programs/src/bin/osd_inspector.rs
Normal file
3
programs/src/bin/osd_inspector.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("OSDInspector")
|
||||||
|
}
|
||||||
3
programs/src/bin/packet_dump.rs
Normal file
3
programs/src/bin/packet_dump.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("PacketDump")
|
||||||
|
}
|
||||||
3
programs/src/bin/prim_inspector.rs
Normal file
3
programs/src/bin/prim_inspector.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("PrimInspector")
|
||||||
|
}
|
||||||
3
programs/src/bin/simple_bot.rs
Normal file
3
programs/src/bin/simple_bot.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("SimpleBot")
|
||||||
|
}
|
||||||
5
programs/src/bin/test_client.rs
Normal file
5
programs/src/bin/test_client.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
let command_count = libremetaverse_programs::commands::TEST_CLIENT_COMMANDS.len();
|
||||||
|
eprintln!("TestClient command inventory contains {command_count} translated targets");
|
||||||
|
libremetaverse_programs::pending_program("TestClient")
|
||||||
|
}
|
||||||
3
programs/src/bin/vivox_test.rs
Normal file
3
programs/src/bin/vivox_test.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("VivoxTest")
|
||||||
|
}
|
||||||
3
programs/src/bin/webrtc_test.rs
Normal file
3
programs/src/bin/webrtc_test.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() -> std::process::ExitCode {
|
||||||
|
libremetaverse_programs::pending_program("WebRtcTest")
|
||||||
|
}
|
||||||
124
programs/src/commands.rs
Normal file
124
programs/src/commands.rs
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
// @generated by tools/generate_surface.py; do not edit by hand.
|
||||||
|
pub const TEST_CLIENT_COMMANDS: &[&str] = &[
|
||||||
|
"BotsCommand",
|
||||||
|
"CloneProfileCommand",
|
||||||
|
"GenericMessageCommand",
|
||||||
|
"PlayAnimationCommand",
|
||||||
|
"TouchCommand",
|
||||||
|
"WhoCommand",
|
||||||
|
"AppearanceCommand",
|
||||||
|
"AttachmentsCommand",
|
||||||
|
"AvatarInfoCommand",
|
||||||
|
"CloneCommand",
|
||||||
|
"WearCommand",
|
||||||
|
"EchoMasterCommand",
|
||||||
|
"IMCommand",
|
||||||
|
"IMGroupCommand",
|
||||||
|
"SayCommand",
|
||||||
|
"ShoutCommand",
|
||||||
|
"WhisperCommand",
|
||||||
|
"Key2NameCommand",
|
||||||
|
"SearchClassifiedsCommand",
|
||||||
|
"SearchEventsCommand",
|
||||||
|
"SearchGroupsCommand",
|
||||||
|
"SearchLandCommand",
|
||||||
|
"SearchPeopleCommand",
|
||||||
|
"SearchPlacesCommand",
|
||||||
|
"ShowEventDetailsCommand",
|
||||||
|
"DownloadTerrainCommand",
|
||||||
|
"GetEstateCovenantCommand",
|
||||||
|
"UploadRawTerrainCommand",
|
||||||
|
"FriendsCommand",
|
||||||
|
"MapFriendCommand",
|
||||||
|
"ActivateGroupCommand",
|
||||||
|
"GroupMembersCommand",
|
||||||
|
"GroupRolesCommand",
|
||||||
|
"GroupsCommand",
|
||||||
|
"InviteGroupCommand",
|
||||||
|
"JoinGroupCommand",
|
||||||
|
"LeaveGroupCommand",
|
||||||
|
"BackupCommand",
|
||||||
|
"BalanceCommand",
|
||||||
|
"ChangeDirectoryCommand",
|
||||||
|
"CreateNotecardCommand",
|
||||||
|
"DeleteFolderCommand",
|
||||||
|
"DownloadCommand",
|
||||||
|
"DumpOutfitCommand",
|
||||||
|
"EmptyLostAndFound",
|
||||||
|
"EmptyTrashCommand",
|
||||||
|
"GiveAllCommand",
|
||||||
|
"GiveItemCommand",
|
||||||
|
"InventoryCommand",
|
||||||
|
"ListContentsCommand",
|
||||||
|
"ObjectInventoryCommand",
|
||||||
|
"ScriptCommand",
|
||||||
|
"TaskRunningCommand",
|
||||||
|
"TreeCommand",
|
||||||
|
"UploadImageCommand",
|
||||||
|
"UploadScriptCommand",
|
||||||
|
"ViewNotecardCommand",
|
||||||
|
"XferCommand",
|
||||||
|
"AgentLocationsCommand",
|
||||||
|
"FindSimCommand",
|
||||||
|
"GridLayerCommand",
|
||||||
|
"GridMapCommand",
|
||||||
|
"ParcelDetailsCommand",
|
||||||
|
"ParcelInfoCommand",
|
||||||
|
"ParcelPrimOwnersCommand",
|
||||||
|
"ParcelSelectObjectsCommand",
|
||||||
|
"SyntaxIdCommand",
|
||||||
|
"WindCommand",
|
||||||
|
"BackCommand",
|
||||||
|
"CrossRegionCommand",
|
||||||
|
"CrouchCommand",
|
||||||
|
"FlyCommand",
|
||||||
|
"FlyToCommand",
|
||||||
|
"FollowCommand",
|
||||||
|
"ForwardCommand",
|
||||||
|
"GoHome",
|
||||||
|
"GotoCommand",
|
||||||
|
"GotoLandmark",
|
||||||
|
"JumpCommand",
|
||||||
|
"LeftCommand",
|
||||||
|
"LocationCommand",
|
||||||
|
"MoveToCommand",
|
||||||
|
"RightCommand",
|
||||||
|
"SetHome",
|
||||||
|
"SitCommand",
|
||||||
|
"SitOnCommand",
|
||||||
|
"StandCommand",
|
||||||
|
"TurnToCommand",
|
||||||
|
"ChangePermsCommand",
|
||||||
|
"DeRezObjectCommand",
|
||||||
|
"DownloadTextureCommand",
|
||||||
|
"ExportCommand",
|
||||||
|
"ExportParticlesCommand",
|
||||||
|
"FindObjectsCommand",
|
||||||
|
"FindTextureCommand",
|
||||||
|
"ImportCommand",
|
||||||
|
"PrimCountCommand",
|
||||||
|
"PrimInfoCommand",
|
||||||
|
"PrimRegexCommand",
|
||||||
|
"TexturesCommand",
|
||||||
|
"DilationCommand",
|
||||||
|
"NetstatsCommand",
|
||||||
|
"RegionInfoCommand",
|
||||||
|
"StatsCommand",
|
||||||
|
"UptimeCommand",
|
||||||
|
"AtCommand",
|
||||||
|
"DebugCommand",
|
||||||
|
"HelpCommand",
|
||||||
|
"LoadCommand",
|
||||||
|
"LogPacketCommand",
|
||||||
|
"LoginCommand",
|
||||||
|
"LogoutCommand",
|
||||||
|
"MD5Command",
|
||||||
|
"QuitCommand",
|
||||||
|
"SetMasterCommand",
|
||||||
|
"SetMasterKeyCommand",
|
||||||
|
"ShowEffectsCommand",
|
||||||
|
"SleepCommand",
|
||||||
|
"WaitForLoginCommand",
|
||||||
|
"ParcelVoiceInfo",
|
||||||
|
"VoiceAcountCommand",
|
||||||
|
];
|
||||||
5
programs/src/lib.rs
Normal file
5
programs/src/lib.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
//! Rust targets corresponding to the upstream example and tool projects.
|
||||||
|
|
||||||
|
pub mod commands;
|
||||||
|
|
||||||
|
pub use libremetaverse::shim::pending_program;
|
||||||
602
programs/upstream-programs.json
Normal file
602
programs/upstream-programs.json
Normal file
@@ -0,0 +1,602 @@
|
|||||||
|
{
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"projects": [
|
||||||
|
{
|
||||||
|
"project": "VivoxTest",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/VivoxTest/VoiceTest.cs",
|
||||||
|
"sha256": "778aca767d54192ae9fe5e1e4002835aa60777f81e3c5a399822b8fb1eb6da2f"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "WebRtcTest",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/WebRtcTest/NativeCrashDumper.cs",
|
||||||
|
"sha256": "180bedfac40b6ddf7013721397f77d2debed0b81c17286c1f67c38ae05a9bc3e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/WebRtcTest/WebRtcTest.cs",
|
||||||
|
"sha256": "1e76e873f470379fb3ffc3f0bd06b8da41fae286c82e29c7ac398f727287d03c"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "IRCGateway",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/IRCGateway/IRCClient.cs",
|
||||||
|
"sha256": "4d9efdfc8546488f8920d63ca704fa80663c02ac6cbb1838f7d6f398108fb5f5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/IRCGateway/Program.cs",
|
||||||
|
"sha256": "f88d21b047ffc15482d4fe2698133c370970ba35fea9de87c3e0bd34ef4076ff"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "InventoryExplorer",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/InventoryExplorer/InventoryExplorer.cs",
|
||||||
|
"sha256": "d3df96b58970419245a921b0a66d5b42b4e1dd31ac0e6cb7b7808a6aef9898d7"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "PacketDump",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/PacketDump/PacketDump.cs",
|
||||||
|
"sha256": "a9dab1e17dca44f1ceb481b20d993d4d7f26d8df499ead5bc3f2493f4917a1e6"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "PrimInspector",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/PrimInspector/PrimInspector.cs",
|
||||||
|
"sha256": "3679313947ebfe7129d0bfb2642fc24fe7dd3fd22d1a58ae6f25b1cf7206e1a9"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "SimpleBot",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/SimpleBot/SimpleBot.cs",
|
||||||
|
"sha256": "de18399bf1feb8e87eee8f057da8dc1b583ec8a1aa1b9aecb2723308cdc1bf1a"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "TestClient",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Arguments.cs",
|
||||||
|
"sha256": "2962d0aedfd308621a71836ef5e79234fcf6c42ee1f315b24179f751e9ffb6ef"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/ClientManager.cs",
|
||||||
|
"sha256": "2177beeee0865e9f1d9f8ccc48df34c6311fea5ef043ca9a8f78dea2162905b4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Command.cs",
|
||||||
|
"sha256": "9194f51011f19f6a2e7282c313f62beaabdbc3d861cb1726625222d5af894fc2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/CommandLineParser.cs",
|
||||||
|
"sha256": "b3ffabe691fff46a60037bdbbac3f47f5ed7831064c0e864c1dfc4dbd406883f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Agent/BotsCommand.cs",
|
||||||
|
"sha256": "91e72d060b526f7e71d44a82f999f28ef5b3ec527ca47efc7ef8bd4ca4e75bef"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Agent/CloneProfileCommand.cs",
|
||||||
|
"sha256": "7de3f0574a8c31b716d27ea161c74837206c87a1b2a0eadae2c1e62cb7a19f3a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Agent/GenericMessageCommand.cs",
|
||||||
|
"sha256": "e80b49b23e4e0f9d4c143447ee6d38eca421a6cc85f52a45b9253c721431d926"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Agent/PlayAnimationCommand.cs",
|
||||||
|
"sha256": "44177f99c0f75dd511bf895833cf7f8046fa371e133b1a7b31ca04dad50e137c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Agent/TouchCommand.cs",
|
||||||
|
"sha256": "050c4783cb018d8d6aa45e0c085d4d3bdf465991632dfa4cc668c09ce4d9a7a4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Agent/WhoCommand.cs",
|
||||||
|
"sha256": "fb825e25e7fa09204ec2178234d45c1ad8cb39a56de68fa04fb1304623921d7c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Appearance/AppearanceCommand.cs",
|
||||||
|
"sha256": "1a2f44a7bd7ab64d15199eb4ab393ae1d9c39e2c1d8ed6c3a1cf10ce2b059d4c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Appearance/AttachmentsCommand.cs",
|
||||||
|
"sha256": "90947ced7f797a1d93cbe9b8665f7d023ddab54412bd8d3b846b099ee954f1c5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Appearance/AvatarInfoCommand.cs",
|
||||||
|
"sha256": "3f786427ee390521615491a87f425a5f5fd2f537eafc4a87be70b798fe58722c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Appearance/CloneCommand.cs",
|
||||||
|
"sha256": "45a90c3e0e233b63d7df6157f79728a7a1f06e43ca73fade4d7d3a0e86689d2a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Appearance/WearCommand.cs",
|
||||||
|
"sha256": "daa7dd8d08ff91cc454f0b9b7de1ab38c07af5935d9dd2aa2d85901bdec64708"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Communication/EchoMasterCommand.cs",
|
||||||
|
"sha256": "185358e59de2119234451b488f718a16ed683a2771a4332a5850eabd249ee128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Communication/IMCommand.cs",
|
||||||
|
"sha256": "3ca6d00cb8bf3da9a14f5e4758ad2850ffbdd311f1e6acfc76ea07d43336a77c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Communication/IMGroupCommand.cs",
|
||||||
|
"sha256": "9013f8ada2147dc3bcba4f32f6080cbee54c8179b7d08ef77b087c8ea75283a4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Communication/SayCommand.cs",
|
||||||
|
"sha256": "dc1c4815ec124930c93018ec78517ed5b59f4066ee35f5e82c30f0b451822986"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Communication/ShoutCommand.cs",
|
||||||
|
"sha256": "b5782673a1aa0641c3f6b76acbaa1d6ece94c1370be78e781e10e804a5459591"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Communication/WhisperCommand.cs",
|
||||||
|
"sha256": "b9e856d07de8b7d75605042e3e2f96365ed779249d652bce636273486cb191e5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/Key2NameCommand.cs",
|
||||||
|
"sha256": "c173d5320277fd696859f8635035dd7ac2f800e5a540aa0d49ffe1130780e560"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/SearchClassifiedsCommand.cs",
|
||||||
|
"sha256": "3dd211c30834d9d3f5ccd9f2ab7fde619293b64f0ff348b6d9ea13a020283a9f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/SearchEventsCommand.cs",
|
||||||
|
"sha256": "b2a7afc28c759ae4059e6d211067eb19394a6fd014f3303c737572ebaaf5f07b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/SearchGroupsCommand.cs",
|
||||||
|
"sha256": "a7d82d2726fb2b3d3bd0074fb10b9b9f334f17dbe4e878ec1c8e3bbf48f2486a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/SearchLandCommand.cs",
|
||||||
|
"sha256": "c34c2e7a04b33f49bb137aa173fde15620038b6f9d822e5483b534237f0f23e8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/SearchPeopleCommand.cs",
|
||||||
|
"sha256": "8431f604255d10711ecc3b99845faff914b62c079e0d73e302b877e3722731ee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/SearchPlacesCommand.cs",
|
||||||
|
"sha256": "cb5f68cc5d5a63d6fbe039ba72377270242372d4f3d9dd036e9c79af333dd4a9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Directory/ShowEventDetailsCommand.cs",
|
||||||
|
"sha256": "70e6760916714278cac2dbe772b96ca9715adb99cad95e2e8c66fc914cfd6a14"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Estate/DownloadTerrainCommand.cs",
|
||||||
|
"sha256": "4cf217957792e4c4f8c08a8676fa4e727668a37fcdfac60b5057d592900b99cf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Estate/GetEstateCovenantCommand.cs",
|
||||||
|
"sha256": "216687705afb43c6aa90494c57cb24bf6f94c6f50ef9349009a5908e24770979"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Estate/UploadRawTerrainCommand.cs",
|
||||||
|
"sha256": "f98732d16d40e25d0ea27b430930be4638b7deff286f2f350e254818cee3b3ec"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Friends/FriendsCommand.cs",
|
||||||
|
"sha256": "b7fadc1555f0d4e34a39885594f92cd0f7907537529c23aca373b55bcbff933b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Friends/MapFriendCommand.cs",
|
||||||
|
"sha256": "67cfbffa581c31277a4f2f6d33f9f891e593b89b2503f9946ef34522605e3a29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/ActivateGroupCommand.cs",
|
||||||
|
"sha256": "bff0863baaf134d79b36ed28c52dce0fc803930df1a8517e2ddcc9ae6a42ed9b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/GroupMembersCommand.cs",
|
||||||
|
"sha256": "276658ad5be8f7c1507e381f907770005df218e37ba157e66bd3f5d492d9c770"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/GroupRolesCommand.cs",
|
||||||
|
"sha256": "f9a6e5d258e9e754afd40ed050b9279520a6bd334ff36df3d4189771bdb4365d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/GroupsCommand.cs",
|
||||||
|
"sha256": "40a4388a12d17435a68d30985b942cd750bde55c125b63bdd5e1d89f4c91ea25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/InviteGroupCommand.cs",
|
||||||
|
"sha256": "f304a5920dec0e4d287e947eef3da9256aa3ed6dc764a45b610aa217bff8e1c1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/JoinGroupCommand.cs",
|
||||||
|
"sha256": "8ab5b125650f584191ae0b14db9b608aa70fb5aa1760dfc375555891e74cf264"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Groups/LeaveGroupCommand.cs",
|
||||||
|
"sha256": "24fe8d1a872c17e92482dd4b2e3138edc258d41cbd11bbee8d0826278cc17f0d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/BackupCommand.cs",
|
||||||
|
"sha256": "dfa6b8c1135431aa33222b1ddacd89f6920fc821a281ad933de898e516bc55a4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/BalanceCommand.cs",
|
||||||
|
"sha256": "32be1e6f29e949c89f95366ec5147620ba5fe57045a725eca0136a9edd9441a6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/ChangeDirectoryCommand.cs",
|
||||||
|
"sha256": "fb639ac1e031b3b862a5d72c22a7cbfa6853ddfa193d4c2c3f4366d083200e79"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/CreateNotecardCommand.cs",
|
||||||
|
"sha256": "5b71c6877cc5297d509f97f3a8c107428885e87254d4ba81899f6db437501d9e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/DeleteFolderCommand.cs",
|
||||||
|
"sha256": "73cd712fcf1350b345cba7af4a05a0d29282f60f94da39c30619770f9e058083"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/DownloadCommand.cs",
|
||||||
|
"sha256": "350fdaec1927b1755a13e0cf036808dab94083b699817ab7236f3a32ee94b0b0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs",
|
||||||
|
"sha256": "0cc77a5db2d10c0592f49b53e9de2702c65c82033bca14b4a133d48513ef4440"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/EmptyLostAndFound.cs",
|
||||||
|
"sha256": "0602c13036d528cdc7e0c727873d6b68af3507c1abf0b3138733a8c7aa0c9b78"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/EmptyTrashCommand.cs",
|
||||||
|
"sha256": "2d7ced1e8bc05545032eaf9be1ce1ac42845f97ad99ca85352441a8a37368b7e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/GiveAllCommand.cs",
|
||||||
|
"sha256": "944d1acc279770ba1a2908ff7dd59091f4a404308dacde3e29f689a63e06fc02"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/GiveItemCommand.cs",
|
||||||
|
"sha256": "d7f93e9686d81d87f8fef13c2fd67b1daad059af9ee83cdd456217fdf6270d13"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/InventoryCommand.cs",
|
||||||
|
"sha256": "77cc75c5dd3aa754adc032d582feb4c068ccea42b129b97ac6eb9111a3463804"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/ListContentsCommand.cs",
|
||||||
|
"sha256": "3bd3f9a4815588f872e1fbd75bead0b8c33fbc9cd80434db0434acf7eba793d3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/ObjectInventoryCommand.cs",
|
||||||
|
"sha256": "7cdc5726a19c24e3a32eb0541378c977030e3dad9dc3644714439787ee6514f9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/ScriptCommand.cs",
|
||||||
|
"sha256": "4725a7fe689645e7694d4b630ad6404877520bcfcafcbdac608a7b20838a9a99"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/TaskRunningCommand.cs",
|
||||||
|
"sha256": "5ec130e43bdbc7fcd3dfd6febaef52e60b61d70e7350e55e3a824b1f5be72783"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/TreeCommand.cs",
|
||||||
|
"sha256": "7f6037570dcedaac8facff86f9011c4dbaf5928f2d9717f4a13c7883464352ee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/UploadImageCommand.cs",
|
||||||
|
"sha256": "72ac9444fc07548ada97ce78247d1e84d30830a1b16e6b730876757d3dfdf2f0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/UploadScriptCommand.cs",
|
||||||
|
"sha256": "933181fc62a7f133101eb3221f5a53967a8e01a4a1677d9f8fa6333d4f26565e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/ViewNotecardCommand.cs",
|
||||||
|
"sha256": "37801f29f08be91bb645bd05a979b2816decd4bad1a9cfe033b0253905e28f4d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Inventory/XferCommand.cs",
|
||||||
|
"sha256": "853b0f6382411b3be68f01b20683c714ae91810f39238b07e1bb2f2f7758de87"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/AgentLocationsCommand.cs",
|
||||||
|
"sha256": "6d43ea92b783b78ac865fba26a0b8c9550e11fcc5d0c482386b04602daaec7d0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/FindSimCommand.cs",
|
||||||
|
"sha256": "9f06cf9653c26e5b9bd2717b17be657b82a40580a17058f6d5a0e9d136db2be1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/GridLayerCommand.cs",
|
||||||
|
"sha256": "9c8163440e92cfefbd1d6e66fae7c62ed47eaca582c865c9f541d404623c16a2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/GridMapCommand.cs",
|
||||||
|
"sha256": "29015b968060b7ab36f97a84c939c2ff0da2b9e45823e69b90bb327df7e0bbce"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/ParcelDetailsCommand.cs",
|
||||||
|
"sha256": "8258646e27c2b605067b02196d408403f802939bd7fe11c264f24bf4380806e6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/ParcelInfoCommand.cs",
|
||||||
|
"sha256": "aed62379d53390cf3bb8eaa7c9887223776d2ba2b29f3a0c0beef5e56c6dfc04"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/ParcelPrimOwnersCommand.cs",
|
||||||
|
"sha256": "bc6dd4ed0979e8e6f34e067983e744f96a1feb9a21c5fd4acf92b916b0c2624a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/ParcelSelectObjectsCommand.cs",
|
||||||
|
"sha256": "d7d0b8f4b47ef208d0bfeaddb29237e68c4d6015d0e322d47dd7c28f66c8b015"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/SyntaxIdCommand.cs",
|
||||||
|
"sha256": "e750f0b2d90b7d6e3201b8ea581b1a29fa56ae7fffc1e408e35394f80148ddcc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Land/WindCommand.cs",
|
||||||
|
"sha256": "d8df01be9bd4fb98488d3277a62a7982b1831986c19787fa401c5f41a7b17f41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/BackCommand.cs",
|
||||||
|
"sha256": "79615342e759d89b04c6ab3b35fababe94e92c2d194eb2cdebbc9f65b2a83387"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/CrossRegionCommand.cs",
|
||||||
|
"sha256": "b21efbbbe6776bd321eec6ab69ad115bc684d12afe45f74732743ba4b2c5a578"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/CrouchCommand.cs",
|
||||||
|
"sha256": "b61a465265b41bfd74421cac17338fef9c779880372987147c67a932e4504dd7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/FlyCommand.cs",
|
||||||
|
"sha256": "7a410ad5fa0b11624dfb398aa4c8d171b20c06fa934873194c6dace014ffd51c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/FlyToCommand.cs",
|
||||||
|
"sha256": "511e08d8cdd94a321dc1086d04e0b8bb5412a6657bec2f564323a36940500737"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/FollowCommand.cs",
|
||||||
|
"sha256": "9f91255e0165ebc0d4e3fae273e9209a4fef49409d39c4f4422f081299122f34"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/ForwardCommand.cs",
|
||||||
|
"sha256": "ac8b59d8b55fa5c7f02bc5b9d8bb3a06a875201c7085a70c719fdca143dcb9ef"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/GoHome.cs",
|
||||||
|
"sha256": "685a550f85f8e2707de417c09defb3f03b1aace667f277e4dfbaf1c21d90d6dc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/GotoCommand.cs",
|
||||||
|
"sha256": "cca424d96b54b9f5f30bcbf627c5331b4e8e8c112d58fa9b8f190900fc35aa57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/GotoLandmark.cs",
|
||||||
|
"sha256": "4d18898bf50bad65008e609b41df935d7c9f4501b13869b09267c23baa057c3f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/JumpCommand.cs",
|
||||||
|
"sha256": "f2b1586e537e593285400ecb76e6b52de8e47fd73f57b01bee84a4c317ddfdd9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/LeftCommand.cs",
|
||||||
|
"sha256": "d85e635eeb0cea968085b1b35ea7d18a4480b120a6fb27f1327c446359618914"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/LocationCommand.cs",
|
||||||
|
"sha256": "a9c1446162b8f6bc2cc796f4256e957017f31f535e5e9bb91ad36c6d0a92c18b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/MoveToCommand.cs",
|
||||||
|
"sha256": "4d0c187ac0b9436507255a8172d54dd3ea160d8836bd6b403a74a23377086c50"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/RightCommand.cs",
|
||||||
|
"sha256": "62512e683c50fabdc227c84dfcfad85f0ff07bde9bea63d53ba7844df612a321"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/SetHome.cs",
|
||||||
|
"sha256": "117b1455ac79f5388d031647585af3a22423796ebd9985978a25e0b51a9c6604"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/SitCommand.cs",
|
||||||
|
"sha256": "135edef44921e4f7014982f345894e5ef7634f70215d33253e540913820e97bd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/SitOnCommand.cs",
|
||||||
|
"sha256": "f41e4c5243829956b6f1ef62310ebbddbb6503ea205b934af17489adf8a8b52a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/StandCommand.cs",
|
||||||
|
"sha256": "a3c00a06db5f7edd6cd25141fedf844f137676c8b043b3d4f8e170bea758b0a9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Movement/TurnToCommand.cs",
|
||||||
|
"sha256": "e3559dcbd3e2b9ef91bc96ae944c77b416c25062d92f56322afb6e59e700b5f9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/ChangePermsCommand.cs",
|
||||||
|
"sha256": "289b606d44acf135d93f950ff3cdfefe6041b1acfc7e0d372560198bd5f3981e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/DeRezObjectCommand.cs",
|
||||||
|
"sha256": "2fc8787b723502c7733c266293ab5c0e9b9f6dac8567cbe54cd4bbed51c115e7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/DownloadTextureCommand.cs",
|
||||||
|
"sha256": "a158ce466164fd6635450869c73b48f633a9d5277face5eba320ef27e78612c0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/ExportCommand.cs",
|
||||||
|
"sha256": "a7905b9bf2d12101eee2a056a8deb11facb172c30ea803f14ccb02cc4c8a50a6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/ExportParticlesCommand.cs",
|
||||||
|
"sha256": "65b21c4e59f6a961cb09b4e1bdef64b3dd52de308b2f6536a0acc9f25ca3de7e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/FindObjectsCommand.cs",
|
||||||
|
"sha256": "954bd773d2078109e3e499c5245cd24fad3c45aac1f60588d021f38506f6ddfb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/FindTextureCommand.cs",
|
||||||
|
"sha256": "7f8685a6cb0142beae1df21d349a795308a3e174fa4e721cfceab5c919e06e32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/ImportCommand.cs",
|
||||||
|
"sha256": "05b2d8fbb22c16fb012768ca03b4ad57f1f9479a43b13552f26ffc72fc83246c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/PrimCountCommand.cs",
|
||||||
|
"sha256": "50eda1fa24d635335bf3b7f7e3b835fa1ff8a01aadb186c6e81c50af13123c0d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/PrimInfoCommand.cs",
|
||||||
|
"sha256": "b0f2771055b653ba47d44cc9916c8a13b689824ad22e764ae041aef06be15169"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/PrimRegexCommand.cs",
|
||||||
|
"sha256": "f91da5c82f59b314363bdd9fccfa10dacd0358551327fd06650107e2d928190e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Prims/TexturesCommand.cs",
|
||||||
|
"sha256": "8a6579a4a2d56d6e5e66b1e0e0511b5b669b774ac69374d143644bbe721cff05"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Stats/DilationCommand.cs",
|
||||||
|
"sha256": "b49f5946d301fa3345f93b87fbad3ec19161b0148cc880b90b7662846d99ee44"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Stats/NetstatsCommand.cs",
|
||||||
|
"sha256": "48cf8d2c0cdb4792ef92a606ccee96c8294414c76f2e2d26c22a664eb7e25206"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Stats/RegionInfoCommand.cs",
|
||||||
|
"sha256": "c95f7d146f06dc506b3ae47bb83128e27732f369c807771a2392d3f11a1d0c00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Stats/StatsCommand.cs",
|
||||||
|
"sha256": "5a2d88ea1d448462f1ad01302ffb9556c9d29d0f6ab27a8df93ef50e0e0bd86d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Stats/UptimeCommand.cs",
|
||||||
|
"sha256": "7c7adde4397207739b8915d683a57ac1c98bbc26b1dbef593e7ac422b373e28c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/AtCommand.cs",
|
||||||
|
"sha256": "430f53079c7a75434816c405f726916e9f6be01bf56baf6ec2ae1d17f82944b2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/DebugCommand.cs",
|
||||||
|
"sha256": "1108face1e6282353f37e45b7bded4c9d9d94493c936c72932b353d2d4facc78"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/HelpCommand.cs",
|
||||||
|
"sha256": "4ca172efc632b7d173a99786322a76024e91d8aba73c74b24ff5dac925d3b77a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/LoadCommand.cs",
|
||||||
|
"sha256": "6c46560a601b5f93727f7873db18dbe359f1af642adfa7a915506bf58bd2e0ca"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/LogPacketCommand.cs",
|
||||||
|
"sha256": "6774b59edefe7466e96cad2f42019e3341f5feb7dca4ff1647df58c5ad4605bd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/LoginCommand.cs",
|
||||||
|
"sha256": "f87d01ede145ca2ab87cd848002490138a4bb68b68a3475b895d030d96243ccf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/LogoutCommand.cs",
|
||||||
|
"sha256": "b6537ad2530753ee3df281881d3fa6350235c31ef5a7417508ea491a1fd79bdd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/MD5Command.cs",
|
||||||
|
"sha256": "cbb9c1ab78b03d93155d42a085fc1134b700bd81ea7d5a3c4327ee1efbe3d44c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/QuitCommand.cs",
|
||||||
|
"sha256": "41e39b8ca0ab5a0dfef0ff6019486e52e1b8b475b0bf8ac0cd58556e5bbfc139"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/SetMasterCommand.cs",
|
||||||
|
"sha256": "5f580ea08d74dafa0b82cdb55682a66e4ac13fcfa48e0855581700e1779845cc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/SetMasterKeyCommand.cs",
|
||||||
|
"sha256": "4b0012056116c1e7d52dd6c7f543d80a4a59b94d677170410ea59a5c761933a8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/ShowEffectsCommand.cs",
|
||||||
|
"sha256": "563d8b463b860ef5dfa89abe5308356e942529fb1bcd85a5c07c7c1b802a09a7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/SleepCommand.cs",
|
||||||
|
"sha256": "07709104493147bc775917c4f94322aaf6d78bdc5079a65a8ee5ce409bd7ae30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/System/WaitForLoginCommand.cs",
|
||||||
|
"sha256": "937948c8942868184166c82988c64c8af649acc73f6f23dbafd8e0657bd7dde5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Voice/ParcelVoiceInfo.cs",
|
||||||
|
"sha256": "5eb56a811a56ca5492551b8349e1edb5804942398eedbca5a29529d973ec7a8c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Commands/Voice/VoiceAcountCommand.cs",
|
||||||
|
"sha256": "663bbfb1ef88f230311b2e433d8e395168cc27de6da4d0f6cb2319dceb0dadf9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Parsing.cs",
|
||||||
|
"sha256": "d3097e770bb1402870eb30e70b6112b705b87c8284c419e7adc7b605b1bffa30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/Program.cs",
|
||||||
|
"sha256": "d42ed24ace6116cfa47fdc163bf7cc7d2d3fe6b5d05d250589280443b87bb31a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "Programs/examples/TestClient/TestClient.cs",
|
||||||
|
"sha256": "a2775fed44eb03c9d42c774361d01ac99ad43dfdb73ef7dd2e7e9b0acb71f226"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "OSDInspector",
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "Programs/tools/OSDInspector/OSDInspector.cs",
|
||||||
|
"sha256": "ead5e287c98f76fc8548a919cc102f16e54d937eafc3202aac6d06ee46f8784d"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
1301
tests/PARITY.md
Normal file
1301
tests/PARITY.md
Normal file
File diff suppressed because it is too large
Load Diff
25
tests/compat/Cargo.toml
Normal file
25
tests/compat/Cargo.toml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "libremetaverse-compat-tests"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libremetaverse = { path = "../../crates/libremetaverse" }
|
||||||
|
libremetaverse-imaging = { path = "../../crates/libremetaverse-imaging" }
|
||||||
|
libremetaverse-imaging-skia = { path = "../../crates/libremetaverse-imaging-skia" }
|
||||||
|
libremetaverse-lsl-tools = { path = "../../crates/libremetaverse-lsl-tools" }
|
||||||
|
libremetaverse-prim-mesher = { path = "../../crates/libremetaverse-prim-mesher" }
|
||||||
|
libremetaverse-rendering-mesh-foundry = { path = "../../crates/libremetaverse-rendering-mesh-foundry" }
|
||||||
|
libremetaverse-rendering-simple = { path = "../../crates/libremetaverse-rendering-simple" }
|
||||||
|
libremetaverse-rlv = { path = "../../crates/libremetaverse-rlv" }
|
||||||
|
libremetaverse-structured-data = { path = "../../crates/libremetaverse-structured-data" }
|
||||||
|
libremetaverse-types = { path = "../../crates/libremetaverse-types" }
|
||||||
|
libremetaverse-utilities = { path = "../../crates/libremetaverse-utilities" }
|
||||||
|
libremetaverse-voice-vivox = { path = "../../crates/libremetaverse-voice-vivox" }
|
||||||
|
libremetaverse-voice-webrtc = { path = "../../crates/libremetaverse-voice-webrtc" }
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
9
tests/compat/src/lib.rs
Normal file
9
tests/compat/src/lib.rs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
//! Shared failure marker used by generated compatibility tests.
|
||||||
|
|
||||||
|
/// Fails a not-yet-translated upstream test while retaining parity metadata.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn pending(source: &str, line: u64, test: &str, attribute: &str, body_sha256: &str) -> ! {
|
||||||
|
panic!(
|
||||||
|
"pending LibreMetaverse parity test {test} ({attribute}) from {source}:{line}; C# body sha256={body_sha256}"
|
||||||
|
)
|
||||||
|
}
|
||||||
14369
tests/compat/tests/generated_parity.rs
Normal file
14369
tests/compat/tests/generated_parity.rs
Normal file
File diff suppressed because it is too large
Load Diff
11660
tests/upstream-tests.json
Normal file
11660
tests/upstream-tests.json
Normal file
File diff suppressed because it is too large
Load Diff
346
tools/generate_surface.py
Normal file
346
tools/generate_surface.py
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Generate traceable Rust shims and test/sample parity ledgers from LibreMetaverse.
|
||||||
|
|
||||||
|
This is deliberately a source inventory generator, not a C# parser. It handles
|
||||||
|
the declaration and NUnit forms present in the pinned upstream checkout and
|
||||||
|
fails loudly when its expected counts drift.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import keyword
|
||||||
|
import re
|
||||||
|
from collections import defaultdict
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
UPSTREAM_COMMIT = "2aa70bb68513b39795da5d13c88f31b86e85a3ba"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class Project:
|
||||||
|
source: str
|
||||||
|
crate: str
|
||||||
|
namespace: str
|
||||||
|
|
||||||
|
|
||||||
|
PROJECTS = (
|
||||||
|
Project("LibreMetaverse.Types", "libremetaverse-types", "LibreMetaverse"),
|
||||||
|
Project("LibreMetaverse.StructuredData", "libremetaverse-structured-data", "LibreMetaverse.StructuredData"),
|
||||||
|
Project("LibreMetaverse.Imaging.Abstractions", "libremetaverse-imaging", "LibreMetaverse.Imaging"),
|
||||||
|
Project("LibreMetaverse.Imaging.Skia", "libremetaverse-imaging-skia", "LibreMetaverse.Imaging.Skia"),
|
||||||
|
Project("PrimMesher", "libremetaverse-prim-mesher", "LibreMetaverse.PrimMesher"),
|
||||||
|
Project("LibreMetaverse", "libremetaverse", "LibreMetaverse"),
|
||||||
|
Project("LibreMetaverse.Rendering.Simple", "libremetaverse-rendering-simple", "LibreMetaverse.Rendering"),
|
||||||
|
Project("LibreMetaverse.Rendering.MeshFoundry", "libremetaverse-rendering-mesh-foundry", "LibreMetaverse.Rendering"),
|
||||||
|
Project("LibreMetaverse.LslTools", "libremetaverse-lsl-tools", "LibreMetaverse.LslTools"),
|
||||||
|
Project("LibreMetaverse.RLV", "libremetaverse-rlv", "LibreMetaverse.RLV"),
|
||||||
|
Project("LibreMetaverse.Utilities", "libremetaverse-utilities", "LibreMetaverse.Utilities"),
|
||||||
|
Project("LibreMetaverse.Voice.Vivox", "libremetaverse-voice-vivox", "LibreMetaverse.Voice.Vivox"),
|
||||||
|
Project("LibreMetaverse.Voice.WebRTC", "libremetaverse-voice-webrtc", "LibreMetaverse.Voice.WebRTC"),
|
||||||
|
)
|
||||||
|
|
||||||
|
TYPE_RE = re.compile(
|
||||||
|
r"^\s*public\s+(?:(?:static|abstract|sealed|partial|readonly|unsafe|ref|new)\s+)*"
|
||||||
|
r"(?P<kind>class|struct|interface|enum|delegate|record(?:\s+(?:class|struct))?)\s+"
|
||||||
|
r"(?P<name>@?[A-Za-z_][A-Za-z0-9_]*)(?P<generic><[^>{}()]+>)?",
|
||||||
|
re.MULTILINE,
|
||||||
|
)
|
||||||
|
NAMESPACE_RE = re.compile(r"^\s*namespace\s+([A-Za-z_][A-Za-z0-9_.]*)", re.MULTILINE)
|
||||||
|
TEST_ATTR_RE = re.compile(r"\[(Test|TestCase)(?:\((.*?)\))?\]", re.DOTALL)
|
||||||
|
METHOD_RE = re.compile(
|
||||||
|
r"\b(?:public|internal)\s+(?:static\s+)?(?:async\s+)?"
|
||||||
|
r"(?:void|Task(?:\s*<[^>]+>)?|ValueTask(?:\s*<[^>]+>)?)\s+"
|
||||||
|
r"([A-Za-z_][A-Za-z0-9_]*)\s*\(",
|
||||||
|
re.DOTALL,
|
||||||
|
)
|
||||||
|
CLASS_RE = re.compile(r"\b(?:public|internal)\s+(?:sealed\s+|partial\s+)?class\s+([A-Za-z_][A-Za-z0-9_]*)")
|
||||||
|
|
||||||
|
|
||||||
|
def snake(name: str) -> str:
|
||||||
|
name = name.lstrip("@").replace("-", "_")
|
||||||
|
name = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", name)
|
||||||
|
name = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", name).lower()
|
||||||
|
name = re.sub(r"[^a-z0-9_]", "_", name)
|
||||||
|
if not name or name[0].isdigit():
|
||||||
|
name = f"item_{name}"
|
||||||
|
if keyword.iskeyword(name) or name in {"crate", "self", "super", "type", "match", "mod", "move", "ref", "use", "where", "loop", "async", "await", "dyn"}:
|
||||||
|
name += "_"
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
def rust_type_name(name: str) -> str:
|
||||||
|
name = name.lstrip("@")
|
||||||
|
replacements = {
|
||||||
|
"Self": "SelfType",
|
||||||
|
"box": "BoxShim",
|
||||||
|
"type": "TypeShim",
|
||||||
|
}
|
||||||
|
if name in replacements:
|
||||||
|
return replacements[name]
|
||||||
|
return re.sub(r"[^A-Za-z0-9_]", "_", name)
|
||||||
|
|
||||||
|
|
||||||
|
def source_files(root: Path) -> list[Path]:
|
||||||
|
return sorted(p for p in root.rglob("*.cs") if "obj" not in p.parts and "bin" not in p.parts)
|
||||||
|
|
||||||
|
|
||||||
|
def namespace_at(text: str, position: int) -> str:
|
||||||
|
matches = [m for m in NAMESPACE_RE.finditer(text) if m.start() <= position]
|
||||||
|
return matches[-1].group(1) if matches else ""
|
||||||
|
|
||||||
|
|
||||||
|
def generic_arity(generic: str | None) -> int:
|
||||||
|
if not generic:
|
||||||
|
return 0
|
||||||
|
return len([p for p in generic[1:-1].split(",") if p.strip()])
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ModuleNode:
|
||||||
|
types: dict[str, tuple[str, int, str]] = field(default_factory=dict)
|
||||||
|
children: dict[str, "ModuleNode"] = field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
def add_type(root: ModuleNode, modules: list[str], name: str, kind: str, arity: int, csharp_name: str) -> None:
|
||||||
|
node = root
|
||||||
|
for module in modules:
|
||||||
|
node = node.children.setdefault(module, ModuleNode())
|
||||||
|
node.types.setdefault(name, (kind, arity, csharp_name))
|
||||||
|
|
||||||
|
|
||||||
|
def render_type(name: str, kind: str, arity: int, csharp_name: str, indent: str) -> list[str]:
|
||||||
|
rust_name = rust_type_name(name)
|
||||||
|
kind_label = kind.replace(" ", "_")
|
||||||
|
if kind == "interface":
|
||||||
|
params = "" if arity == 0 else "<" + ", ".join(f"T{i} = ()" for i in range(arity)) + ">"
|
||||||
|
return [
|
||||||
|
f"{indent}/// Shim for C# `{csharp_name}`.",
|
||||||
|
f"{indent}pub trait {rust_name}{params} {{",
|
||||||
|
f"{indent} const CSHARP_NAME: &'static str = \"{csharp_name}\";",
|
||||||
|
f"{indent}}}",
|
||||||
|
]
|
||||||
|
params = "" if arity == 0 else "<" + ", ".join(f"T{i} = ()" for i in range(arity)) + ">"
|
||||||
|
marker = "" if arity == 0 else "(" + "std::marker::PhantomData<(" + ", ".join(f"T{i}" for i in range(arity)) + ",)>" + ")"
|
||||||
|
declaration = f"pub struct {rust_name}{params}" + (";" if not marker else f"{marker};")
|
||||||
|
return [
|
||||||
|
f"{indent}/// `{kind}` shim for C# `{csharp_name}`; members remain intentionally unimplemented.",
|
||||||
|
f"{indent}#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]",
|
||||||
|
f"{indent}{declaration}",
|
||||||
|
f"{indent}impl{('<' + ', '.join(f'T{i}' for i in range(arity)) + '>') if arity else ''} {rust_name}{('<' + ', '.join(f'T{i}' for i in range(arity)) + '>') if arity else ''} {{",
|
||||||
|
f"{indent} pub const CSHARP_NAME: &'static str = \"{csharp_name}\";",
|
||||||
|
f"{indent} pub const CSHARP_KIND: &'static str = \"{kind_label}\";",
|
||||||
|
f"{indent}}}",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def render_node(node: ModuleNode, indent: str = "") -> list[str]:
|
||||||
|
lines: list[str] = []
|
||||||
|
for name, (kind, arity, csharp_name) in sorted(node.types.items()):
|
||||||
|
lines.extend(render_type(name, kind, arity, csharp_name, indent))
|
||||||
|
lines.append("")
|
||||||
|
for name, child in sorted(node.children.items()):
|
||||||
|
lines.append(f"{indent}pub mod {name} {{")
|
||||||
|
lines.extend(render_node(child, indent + " "))
|
||||||
|
lines.append(f"{indent}}}")
|
||||||
|
lines.append("")
|
||||||
|
return lines
|
||||||
|
|
||||||
|
|
||||||
|
def generate_apis(upstream: Path, output: Path) -> tuple[int, int]:
|
||||||
|
surface_lines = ["project\tfile\tline\tdeclaration_sha256\tdeclaration"]
|
||||||
|
type_lines = ["crate\tnamespace\trust_path\tkind\tcsharp_name\tfile\tline"]
|
||||||
|
total_types = 0
|
||||||
|
total_members = 0
|
||||||
|
for project in PROJECTS:
|
||||||
|
project_root = upstream / project.source
|
||||||
|
tree = ModuleNode()
|
||||||
|
for path in source_files(project_root):
|
||||||
|
text = path.read_text(encoding="utf-8-sig")
|
||||||
|
relative = path.relative_to(upstream).as_posix()
|
||||||
|
for line_no, line in enumerate(text.splitlines(), 1):
|
||||||
|
if re.match(r"^\s*public\s+", line):
|
||||||
|
declaration = " ".join(line.strip().split())
|
||||||
|
digest = hashlib.sha256(declaration.encode()).hexdigest()
|
||||||
|
surface_lines.append(f"{project.source}\t{relative}\t{line_no}\t{digest}\t{declaration}")
|
||||||
|
total_members += 1
|
||||||
|
for match in TYPE_RE.finditer(text):
|
||||||
|
namespace = namespace_at(text, match.start())
|
||||||
|
remainder = namespace
|
||||||
|
if remainder == project.namespace:
|
||||||
|
remainder = ""
|
||||||
|
elif remainder.startswith(project.namespace + "."):
|
||||||
|
remainder = remainder[len(project.namespace) + 1 :]
|
||||||
|
modules = [snake(part) for part in remainder.split(".") if part]
|
||||||
|
name = match.group("name").lstrip("@")
|
||||||
|
kind = match.group("kind")
|
||||||
|
arity = generic_arity(match.group("generic"))
|
||||||
|
csharp_name = ".".join(filter(None, [namespace, name]))
|
||||||
|
add_type(tree, modules, name, kind, arity, csharp_name)
|
||||||
|
rust_path = "::".join(modules + [rust_type_name(name)])
|
||||||
|
line_no = text.count("\n", 0, match.start()) + 1
|
||||||
|
type_lines.append(f"{project.crate}\t{namespace}\t{rust_path}\t{kind}\t{csharp_name}\t{relative}\t{line_no}")
|
||||||
|
total_types += 1
|
||||||
|
generated = [
|
||||||
|
"// @generated by tools/generate_surface.py; do not edit by hand.",
|
||||||
|
f"// Source: LibreMetaverse {UPSTREAM_COMMIT}",
|
||||||
|
"#![allow(non_camel_case_types)]",
|
||||||
|
"",
|
||||||
|
] + render_node(tree)
|
||||||
|
crate_file = output / "crates" / project.crate / "src" / "generated.rs"
|
||||||
|
crate_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
crate_file.write_text("\n".join(generated).rstrip() + "\n")
|
||||||
|
api_dir = output / "api"
|
||||||
|
api_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
(api_dir / "SURFACE.tsv").write_text("\n".join(surface_lines) + "\n")
|
||||||
|
(api_dir / "TYPES.tsv").write_text("\n".join(type_lines) + "\n")
|
||||||
|
return total_types, total_members
|
||||||
|
|
||||||
|
|
||||||
|
def enclosing_class(text: str, position: int) -> str:
|
||||||
|
matches = [m for m in CLASS_RE.finditer(text) if m.start() <= position]
|
||||||
|
return matches[-1].group(1) if matches else "UnknownFixture"
|
||||||
|
|
||||||
|
|
||||||
|
def method_body_hash(text: str, method_start: int) -> str:
|
||||||
|
brace = text.find("{", method_start)
|
||||||
|
arrow = text.find("=>", method_start)
|
||||||
|
if arrow != -1 and (brace == -1 or arrow < brace):
|
||||||
|
end = text.find(";", arrow)
|
||||||
|
body = text[method_start : end + 1]
|
||||||
|
elif brace != -1:
|
||||||
|
depth = 0
|
||||||
|
end = brace
|
||||||
|
for end in range(brace, len(text)):
|
||||||
|
if text[end] == "{":
|
||||||
|
depth += 1
|
||||||
|
elif text[end] == "}":
|
||||||
|
depth -= 1
|
||||||
|
if depth == 0:
|
||||||
|
break
|
||||||
|
body = text[method_start : end + 1]
|
||||||
|
else:
|
||||||
|
body = text[method_start : method_start + 500]
|
||||||
|
return hashlib.sha256(body.encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def generate_tests(upstream: Path, output: Path) -> int:
|
||||||
|
roots = (upstream / "LibreMetaverse.Tests", upstream / "LibreMetaverse.Rendering.Tests")
|
||||||
|
tests: list[dict[str, object]] = []
|
||||||
|
for root in roots:
|
||||||
|
for path in source_files(root):
|
||||||
|
text = path.read_text(encoding="utf-8-sig")
|
||||||
|
relative = path.relative_to(upstream).as_posix()
|
||||||
|
attrs = list(TEST_ATTR_RE.finditer(text))
|
||||||
|
for attr_index, attr in enumerate(attrs):
|
||||||
|
next_attr = attrs[attr_index + 1].start() if attr_index + 1 < len(attrs) else len(text)
|
||||||
|
method = METHOD_RE.search(text, attr.end(), next_attr + 1200)
|
||||||
|
if method is None:
|
||||||
|
method = METHOD_RE.search(text, attr.end())
|
||||||
|
if method is None:
|
||||||
|
raise RuntimeError(f"No test method after {relative}:{text.count(chr(10), 0, attr.start()) + 1}")
|
||||||
|
name = method.group(1)
|
||||||
|
fixture = enclosing_class(text, method.start())
|
||||||
|
attr_text = " ".join(attr.group(0).split())
|
||||||
|
line = text.count("\n", 0, attr.start()) + 1
|
||||||
|
tests.append(
|
||||||
|
{
|
||||||
|
"source": relative,
|
||||||
|
"line": line,
|
||||||
|
"fixture": fixture,
|
||||||
|
"method": name,
|
||||||
|
"attribute": attr_text,
|
||||||
|
"body_sha256": method_body_hash(text, method.start()),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
seen: defaultdict[str, int] = defaultdict(int)
|
||||||
|
rust_lines = [
|
||||||
|
"// @generated by tools/generate_surface.py; do not edit by hand.",
|
||||||
|
f"// Source: LibreMetaverse {UPSTREAM_COMMIT}",
|
||||||
|
"use libremetaverse_compat_tests::pending;",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
parity_lines = [
|
||||||
|
"# NUnit to Rust parity ledger",
|
||||||
|
"",
|
||||||
|
f"Generated from LibreMetaverse `{UPSTREAM_COMMIT}`. Each row is one NUnit `[Test]` or `[TestCase]` invocation. The body hash covers the original C# method declaration and body.",
|
||||||
|
"",
|
||||||
|
"| Rust test | C# test | Source | Attribute | Body SHA-256 |",
|
||||||
|
"|---|---|---|---|---|",
|
||||||
|
]
|
||||||
|
for test in tests:
|
||||||
|
base = snake(f"{test['fixture']}_{test['method']}")
|
||||||
|
seen[base] += 1
|
||||||
|
rust_name = base if seen[base] == 1 else f"{base}_case_{seen[base]}"
|
||||||
|
test["rust_test"] = rust_name
|
||||||
|
identity = f"{test['fixture']}.{test['method']}"
|
||||||
|
rust_lines.extend(
|
||||||
|
[
|
||||||
|
"#[test]",
|
||||||
|
f"fn {rust_name}() {{",
|
||||||
|
f" pending({json.dumps(test['source'])}, {test['line']}, {json.dumps(identity)}, {json.dumps(test['attribute'])}, {json.dumps(test['body_sha256'])});",
|
||||||
|
"}",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
parity_lines.append(
|
||||||
|
f"| `{rust_name}` | `{identity}` | `{test['source']}:{test['line']}` | `{str(test['attribute']).replace('|', '|')}` | `{test['body_sha256']}` |"
|
||||||
|
)
|
||||||
|
generated_dir = output / "tests" / "compat" / "tests"
|
||||||
|
generated_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
(generated_dir / "generated_parity.rs").write_text("\n".join(rust_lines))
|
||||||
|
(output / "tests" / "PARITY.md").write_text("\n".join(parity_lines) + "\n")
|
||||||
|
(output / "tests" / "upstream-tests.json").write_text(json.dumps({"upstream_commit": UPSTREAM_COMMIT, "tests": tests}, indent=2) + "\n")
|
||||||
|
return len(tests)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_program_manifest(upstream: Path, output: Path) -> int:
|
||||||
|
roots = [
|
||||||
|
upstream / "Programs" / "VivoxTest",
|
||||||
|
upstream / "Programs" / "WebRtcTest",
|
||||||
|
*sorted((upstream / "Programs" / "examples").iterdir()),
|
||||||
|
*sorted((upstream / "Programs" / "tools").iterdir()),
|
||||||
|
]
|
||||||
|
entries = []
|
||||||
|
for root in roots:
|
||||||
|
if not root.is_dir() or not list(root.glob("*.csproj")):
|
||||||
|
continue
|
||||||
|
files = []
|
||||||
|
for path in source_files(root):
|
||||||
|
data = path.read_bytes()
|
||||||
|
files.append({"path": path.relative_to(upstream).as_posix(), "sha256": hashlib.sha256(data).hexdigest()})
|
||||||
|
entries.append({"project": root.name, "files": files})
|
||||||
|
(output / "programs" / "upstream-programs.json").write_text(json.dumps({"upstream_commit": UPSTREAM_COMMIT, "projects": entries}, indent=2) + "\n")
|
||||||
|
command_files = source_files(upstream / "Programs" / "examples" / "TestClient" / "Commands")
|
||||||
|
command_names = [path.stem for path in command_files]
|
||||||
|
command_rs = [
|
||||||
|
"// @generated by tools/generate_surface.py; do not edit by hand.",
|
||||||
|
"pub const TEST_CLIENT_COMMANDS: &[&str] = &[",
|
||||||
|
*[f" {json.dumps(name)}," for name in command_names],
|
||||||
|
"];",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
(output / "programs" / "src" / "commands.rs").write_text("\n".join(command_rs))
|
||||||
|
return len(entries)
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--upstream", type=Path, default=Path("../libremetaverse"))
|
||||||
|
parser.add_argument("--output", type=Path, default=Path("."))
|
||||||
|
args = parser.parse_args()
|
||||||
|
upstream = args.upstream.resolve()
|
||||||
|
output = args.output.resolve()
|
||||||
|
types, members = generate_apis(upstream, output)
|
||||||
|
tests = generate_tests(upstream, output)
|
||||||
|
programs = generate_program_manifest(upstream, output)
|
||||||
|
if tests != 1295:
|
||||||
|
raise RuntimeError(f"Expected 1295 NUnit invocations at {UPSTREAM_COMMIT}, found {tests}")
|
||||||
|
print(f"generated {types} type declarations, {members} public declaration lines, {tests} tests, and {programs} program manifests")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user