Audit public API and SemVer surface (#103)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 13m8s
Native code generation / deterministic (push) Failing after 2m8s
Concurrency and resource soak audit / soak (push) Failing after 6m39s
Imaging and meshing gate / native (push) Has been cancelled
Release platform and feature matrix / audit (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
JPEG 2000 feature / linux (push) Successful in 2m46s
Skia feature / linux (push) Successful in 31m0s
Some checks failed
API and SemVer surface / api-surface (push) Failing after 13m8s
Native code generation / deterministic (push) Failing after 2m8s
Concurrency and resource soak audit / soak (push) Failing after 6m39s
Imaging and meshing gate / native (push) Has been cancelled
Release platform and feature matrix / audit (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
JPEG 2000 feature / linux (push) Successful in 2m46s
Skia feature / linux (push) Successful in 31m0s
This commit is contained in:
81
.gitea/workflows/api-surface.yml
Normal file
81
.gitea/workflows/api-surface.yml
Normal file
@@ -0,0 +1,81 @@
|
||||
name: API and SemVer surface
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- ".gitea/workflows/api-surface.yml"
|
||||
- "Cargo.lock"
|
||||
- "Cargo.toml"
|
||||
- "api/**"
|
||||
- "ci/evidence/api-audit.json"
|
||||
- "crates/**"
|
||||
- "tests/api-compile/**"
|
||||
- "tests/semver-port/**"
|
||||
- "tools/check_api_coverage.py"
|
||||
- "tools/generate_api_shims.py"
|
||||
- "tools/generate_rust_mapping.py"
|
||||
- "tools/ci-matrix/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- ".gitea/workflows/api-surface.yml"
|
||||
- "Cargo.lock"
|
||||
- "Cargo.toml"
|
||||
- "api/**"
|
||||
- "ci/evidence/api-audit.json"
|
||||
- "crates/**"
|
||||
- "tests/api-compile/**"
|
||||
- "tests/semver-port/**"
|
||||
- "tools/check_api_coverage.py"
|
||||
- "tools/generate_api_shims.py"
|
||||
- "tools/generate_rust_mapping.py"
|
||||
- "tools/ci-matrix/**"
|
||||
|
||||
jobs:
|
||||
api-surface:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CARGO_BUILD_JOBS: "1"
|
||||
CARGO_INCREMENTAL: "0"
|
||||
CARGO_PROFILE_DEV_DEBUG: "0"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install native prerequisites
|
||||
run: sudo apt-get update && sudo apt-get install -y libopus-dev pkg-config
|
||||
|
||||
- name: Install Rust 1.97
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
toolchain: "1.97.0"
|
||||
components: rustfmt, clippy
|
||||
|
||||
- name: Verify deterministic mapping and export coverage
|
||||
run: |
|
||||
python3 tools/generate_rust_mapping.py --check
|
||||
python3 tools/generate_api_shims.py --check
|
||||
python3 tools/check_api_coverage.py
|
||||
|
||||
- name: Verify reviewed API baseline
|
||||
run: |
|
||||
cargo run --locked -p metacrate-ci-matrix -- api-baseline-write
|
||||
git diff --exit-code -- api/SEMVER-BASELINE.json api/SEMVER-AUDIT.md
|
||||
cargo run --locked -p metacrate-ci-matrix -- api-audit --evidence /tmp/metacrate-api-audit.json
|
||||
cmp /tmp/metacrate-api-audit.json ci/evidence/api-audit.json
|
||||
|
||||
- name: Compile downstream API consumers
|
||||
run: |
|
||||
cargo check --locked --manifest-path tests/api-compile/Cargo.toml
|
||||
cargo run --locked --manifest-path tests/semver-port/Cargo.toml
|
||||
|
||||
- name: Check formatting and lints
|
||||
run: |
|
||||
cargo fmt --all -- --check
|
||||
cargo fmt --manifest-path tests/semver-port/Cargo.toml -- --check
|
||||
cargo clippy --locked -p metacrate-ci-matrix --all-targets -- -D warnings
|
||||
cargo clippy --locked --manifest-path tests/semver-port/Cargo.toml --all-targets -- -D warnings
|
||||
|
||||
- name: Upload audit evidence
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: api-semver-audit
|
||||
path: ci/evidence/api-audit.json
|
||||
@@ -63,7 +63,8 @@ jobs:
|
||||
run: |
|
||||
cargo run --locked -p metacrate-ci-matrix -- documentation-report
|
||||
git diff --exit-code -- api/DOCUMENTATION-COVERAGE.md
|
||||
cargo run --locked -p metacrate-ci-matrix -- documentation-audit --evidence ci/evidence/documentation-audit.json
|
||||
cargo run --locked -p metacrate-ci-matrix -- documentation-audit --evidence /tmp/metacrate-documentation-audit.json
|
||||
cmp /tmp/metacrate-documentation-audit.json ci/evidence/documentation-audit.json
|
||||
|
||||
- name: Build warning-free workspace documentation
|
||||
env:
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,6 +2,7 @@
|
||||
/crates/libremetaverse-openjpeg/target/
|
||||
/crates/libremetaverse-openjpeg/Cargo.lock
|
||||
/tests/api-compile/target/
|
||||
/tests/semver-port/target/
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -1775,6 +1775,7 @@ version = "0.0.1"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha2 0.11.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
@@ -5,6 +5,9 @@ selection, ownership, async cancellation, errors, events, native prerequisites,
|
||||
and credential-safe OpenSim operation. The generated
|
||||
[documentation coverage report](api/DOCUMENTATION-COVERAGE.md) ties the public
|
||||
Rust surface back to the pinned C# type and member mappings.
|
||||
The reviewed [first-release API and SemVer audit](api/SEMVER-AUDIT.md) fixes the
|
||||
`0.0.1` public surface, features, ownership and async contracts, and intentional
|
||||
migration differences in a deterministic baseline.
|
||||
|
||||
MetaCrate is a test-driven, clean native Rust reimplementation of
|
||||
[LibreMetaverse](https://github.com/cinderblocks/libremetaverse). LibreMetaverse
|
||||
|
||||
@@ -9,6 +9,6 @@ Generated by `metacrate-ci-matrix documentation-report`; do not edit by hand.
|
||||
| Mapped public members | 30789 | 30789 | 100% |
|
||||
| Compiled Rust guide snippets | 5 | 4 minimum | pass |
|
||||
| Linked native programs | 9 | 9 | 100% |
|
||||
| Checked local Markdown links | 65 | 65 | 100% |
|
||||
| Checked local Markdown links | 69 | 69 | 100% |
|
||||
|
||||
Every mapped item is tied to its exact C# documentation ID and to the ownership, asyncness, error, overload, mapping-kind, and Rust-signature decisions in [`RUST-MAPPING.tsv`](RUST-MAPPING.tsv). Public types are tied to the corresponding type mapping. The upstream source is pinned to [`2aa70bb68513b39795da5d13c88f31b86e85a3ba`](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||
|
||||
@@ -47,7 +47,7 @@ External member APIs are not copied. Each signature type resolves to Rust core/s
|
||||
- Properties/indexers/events: **5,090 / 11 / 268**
|
||||
- Delegates and flags enums: **40 / 46**
|
||||
- Optional/ref/out/in parameters: **470 / 6,144 / 555 / 0**
|
||||
- Async Rust signatures: **328**
|
||||
- Async Rust signatures: **334**
|
||||
- Descriptively renamed overloads: **7,151**
|
||||
- Explicit CLR delegate APM differences: **80**
|
||||
|
||||
|
||||
@@ -61,6 +61,21 @@ rejects stale, missing, duplicate, or erased entries; and verifies
|
||||
`API-COVERAGE.md`. Regenerate that report with
|
||||
`python3 tools/check_api_coverage.py --write`.
|
||||
|
||||
The reviewed first-release public surface is stored in
|
||||
[`SEMVER-BASELINE.json`](SEMVER-BASELINE.json), with the decisions and migration
|
||||
recipes rendered in [`SEMVER-AUDIT.md`](SEMVER-AUDIT.md). The audit compares
|
||||
mapping/export coverage, normalized Rust declarations, feature sets, ownership,
|
||||
async and error contracts, thread-safety boundaries, and public dependency
|
||||
types. Record a deliberate baseline only after reviewing its SemVer impact,
|
||||
then verify it and write reproducible evidence:
|
||||
|
||||
```sh
|
||||
cargo run --locked -p metacrate-ci-matrix -- api-baseline-write
|
||||
cargo run --locked -p metacrate-ci-matrix -- api-audit \
|
||||
--evidence /tmp/metacrate-api-audit.json
|
||||
cmp /tmp/metacrate-api-audit.json ci/evidence/api-audit.json
|
||||
```
|
||||
|
||||
Native implementations replace whole generated types where practical. The
|
||||
generated module retains the catalog markers and re-exports the hand-written
|
||||
type; member-level implementations use an explicit generator registry. This
|
||||
|
||||
@@ -10371,7 +10371,7 @@ M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.AddPolicy(LibreMetavers
|
||||
M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.CanAttach(LibreMetaverse.InventoryItem) method System.Boolean LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.CanAttach(LibreMetaverse.InventoryItem item) libremetaverse appearance libremetaverse::appearance::CompositeCurrentOutfitPolicy::can_attach pub fn can_attach(&self, item: Option<std::sync::Arc<libremetaverse::InventoryItem>>) -> Result<bool, crate::Error> shared_self,optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.CanDetach(LibreMetaverse.InventoryItem) method System.Boolean LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.CanDetach(LibreMetaverse.InventoryItem item) libremetaverse appearance libremetaverse::appearance::CompositeCurrentOutfitPolicy::can_detach pub fn can_detach(&self, item: Option<std::sync::Arc<libremetaverse::InventoryItem>>) -> Result<bool, crate::Error> shared_self,optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.RemovePolicy(LibreMetaverse.Appearance.ICurrentOutfitPolicy) method System.Void LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.RemovePolicy(LibreMetaverse.Appearance.ICurrentOutfitPolicy policyToRemove) libremetaverse appearance libremetaverse::appearance::CompositeCurrentOutfitPolicy::remove_policy pub fn remove_policy(&self, policy_to_remove: Option<std::sync::Arc<dyn libremetaverse::appearance::ICurrentOutfitPolicy>>) -> Result<(), crate::Error> shared_self,optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List<LibreMetaverse.InventoryItem> addedItems, System.Collections.Generic.List<LibreMetaverse.InventoryItem> removedItems, System.Threading.CancellationToken cancellationToken = default) libremetaverse appearance libremetaverse::appearance::CompositeCurrentOutfitPolicy::report_item_change pub async fn report_item_change(&self, added_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, removed_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,optional_shared,optional_shared,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List<LibreMetaverse.InventoryItem> addedItems, System.Collections.Generic.List<LibreMetaverse.InventoryItem> removedItems, System.Threading.CancellationToken cancellationToken = default) libremetaverse appearance libremetaverse::appearance::CompositeCurrentOutfitPolicy::report_item_change pub async fn report_item_change(&self, added_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, removed_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,optional_shared,optional_shared,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CurrentOutfitFolder.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.Appearance.CurrentOutfitFolder(LibreMetaverse.GridClient client) libremetaverse appearance libremetaverse::appearance::CurrentOutfitFolder::new pub fn new(client: Option<std::sync::Arc<libremetaverse::GridClient>>) -> Result<Self, crate::Error> optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CurrentOutfitFolder.AddPolicy(LibreMetaverse.Appearance.ICurrentOutfitPolicy) method LibreMetaverse.Appearance.ICurrentOutfitPolicy LibreMetaverse.Appearance.CurrentOutfitFolder.AddPolicy(LibreMetaverse.Appearance.ICurrentOutfitPolicy policyToAdd) libremetaverse appearance libremetaverse::appearance::CurrentOutfitFolder::add_policy pub fn add_policy(&self, policy_to_add: std::sync::Arc<dyn libremetaverse::appearance::ICurrentOutfitPolicy>) -> Result<std::sync::Arc<dyn libremetaverse::appearance::ICurrentOutfitPolicy>, crate::Error> shared_self,shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.CurrentOutfitFolder.AddToOutfitAsync(LibreMetaverse.InventoryItem,System.Boolean,System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Appearance.CurrentOutfitFolder.AddToOutfitAsync(LibreMetaverse.InventoryItem item, System.Boolean replace, System.Threading.CancellationToken cancellationToken = default) libremetaverse appearance libremetaverse::appearance::CurrentOutfitFolder::add_to_outfit_with_inventory_item_boolean_cancellation_token pub async fn add_to_outfit_with_inventory_item_boolean_cancellation_token(&self, item: libremetaverse::InventoryItem, replace: bool, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
|
||||
@@ -10393,7 +10393,7 @@ M:LibreMetaverse.Appearance.CurrentOutfitFolder.ReplaceOutfitAsync(LibreMetavers
|
||||
M:LibreMetaverse.Appearance.CurrentOutfitFolder.ResolveInventoryLink(LibreMetaverse.InventoryItem) method LibreMetaverse.InventoryItem LibreMetaverse.Appearance.CurrentOutfitFolder.ResolveInventoryLink(LibreMetaverse.InventoryItem itemLink) libremetaverse appearance libremetaverse::appearance::CurrentOutfitFolder::resolve_inventory_link pub fn resolve_inventory_link(&self, item_link: std::sync::Arc<libremetaverse::InventoryItem>) -> Result<Option<std::sync::Arc<libremetaverse::InventoryItem>>, crate::Error> shared_self,shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.ICurrentOutfitPolicy.CanAttach(LibreMetaverse.InventoryItem) method System.Boolean LibreMetaverse.Appearance.ICurrentOutfitPolicy.CanAttach(LibreMetaverse.InventoryItem item) libremetaverse appearance libremetaverse::appearance::ICurrentOutfitPolicy::can_attach pub fn can_attach(&self, item: Option<std::sync::Arc<libremetaverse::InventoryItem>>) -> Result<bool, crate::Error> shared_self,optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.ICurrentOutfitPolicy.CanDetach(LibreMetaverse.InventoryItem) method System.Boolean LibreMetaverse.Appearance.ICurrentOutfitPolicy.CanDetach(LibreMetaverse.InventoryItem item) libremetaverse appearance libremetaverse::appearance::ICurrentOutfitPolicy::can_detach pub fn can_detach(&self, item: Option<std::sync::Arc<libremetaverse::InventoryItem>>) -> Result<bool, crate::Error> shared_self,optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.ICurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Appearance.ICurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List<LibreMetaverse.InventoryItem> addedItems, System.Collections.Generic.List<LibreMetaverse.InventoryItem> removedItems, System.Threading.CancellationToken cancellationToken = default) libremetaverse appearance libremetaverse::appearance::ICurrentOutfitPolicy::report_item_change pub fn report_item_change(&self, added_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, removed_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<(), crate::Error>> + Send + '_>> shared_self,optional_shared,optional_shared,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.ICurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Appearance.ICurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List<LibreMetaverse.InventoryItem> addedItems, System.Collections.Generic.List<LibreMetaverse.InventoryItem> removedItems, System.Threading.CancellationToken cancellationToken = default) libremetaverse appearance libremetaverse::appearance::ICurrentOutfitPolicy::report_item_change pub fn report_item_change(&self, added_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, removed_items: Option<std::sync::Arc<Vec<libremetaverse::InventoryItem>>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<(), crate::Error>> + Send + '_>> shared_self,optional_shared,optional_shared,optional_owned boxed_future Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.InitialOutfit.#ctor(LibreMetaverse.GridClient,LibreMetaverse.Appearance.CurrentOutfitFolder) constructor LibreMetaverse.Appearance.InitialOutfit(LibreMetaverse.GridClient client, LibreMetaverse.Appearance.CurrentOutfitFolder cof) libremetaverse appearance libremetaverse::appearance::InitialOutfit::new pub fn new(client: libremetaverse::GridClient, cof: libremetaverse::appearance::CurrentOutfitFolder) -> Result<Self, crate::Error> owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.InitialOutfit.CheckSystemFoldersAsync(System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Appearance.InitialOutfit.CheckSystemFoldersAsync(System.Threading.CancellationToken cancellationToken = default) libremetaverse appearance libremetaverse::appearance::InitialOutfit::check_system_folders pub async fn check_system_folders(&self, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.Appearance.InitialOutfit.CopyFolderAsync(LibreMetaverse.InventoryFolder,LibreMetaverse.UUID,System.Threading.CancellationToken,System.IProgress{LibreMetaverse.Appearance.InitialOutfit.InitialOutfitProgress}) method System.Threading.Tasks.Task<LibreMetaverse.UUID> LibreMetaverse.Appearance.InitialOutfit.CopyFolderAsync(LibreMetaverse.InventoryFolder folder, LibreMetaverse.UUID destination, System.Threading.CancellationToken cancellationToken = default, System.IProgress<LibreMetaverse.Appearance.InitialOutfit.InitialOutfitProgress> progress = default) libremetaverse appearance libremetaverse::appearance::InitialOutfit::copy_folder pub async fn copy_folder(&self, folder: libremetaverse::InventoryFolder, destination: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, progress: Option<Box<dyn libremetaverse_types::compat::IProgress<libremetaverse::appearance::InitialOutfitInitialOutfitProgress>>>) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
@@ -11887,7 +11887,7 @@ M:LibreMetaverse.InventoryManager.CreateItemFromAssetAsync(System.Byte[],System.
|
||||
M:LibreMetaverse.InventoryManager.CreateItemFromAssetResult.#ctor constructor LibreMetaverse.InventoryManager.CreateItemFromAssetResult() libremetaverse libremetaverse::InventoryManagerCreateItemFromAssetResult::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.CreateItemFromAssetVariablePriceAsync(System.Byte[],System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.InventoryType,LibreMetaverse.UUID,LibreMetaverse.Permissions,System.Func{System.Int32,System.Boolean},System.Threading.CancellationToken,System.IProgress{LibreMetaverse.HttpCapsClient.ProgressReport}) method System.Threading.Tasks.Task<LibreMetaverse.InventoryManager.CreateItemFromAssetResult> LibreMetaverse.InventoryManager.CreateItemFromAssetVariablePriceAsync(System.Byte[] data, System.String name, System.String description, LibreMetaverse.AssetType assetType, LibreMetaverse.InventoryType invType, LibreMetaverse.UUID folderID, LibreMetaverse.Permissions permissions, System.Func<System.Int32, System.Boolean> confirmCost = default, System.Threading.CancellationToken cancellationToken = default, System.IProgress<LibreMetaverse.HttpCapsClient.ProgressReport> progress = default) libremetaverse libremetaverse::InventoryManager::create_item_from_asset_variable_price pub async fn create_item_from_asset_variable_price(&self, data: Vec<u8>, name: String, description: String, asset_type: libremetaverse_types::AssetType, inv_type: libremetaverse_types::InventoryType, folder_id: libremetaverse_types::UUID, permissions: libremetaverse::Permissions, confirm_cost: Option<Box<dyn Fn(i32) -> bool + Send + Sync>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, progress: Option<Box<dyn libremetaverse_types::compat::IProgress<libremetaverse::HttpCapsClientProgressReport>>>) -> Result<libremetaverse::InventoryManagerCreateItemFromAssetResult, crate::Error> shared_self,owned,owned,owned,owned,owned,owned,owned,optional_owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.CreateLinkAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.InventoryType,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryManager.CreateLinkAsync(LibreMetaverse.UUID folderID, LibreMetaverse.UUID itemID, System.String name, System.String description, LibreMetaverse.InventoryType invType, LibreMetaverse.UUID transactionID, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::create_link pub async fn create_link(&self, folder_id: libremetaverse_types::UUID, item_id: libremetaverse_types::UUID, name: String, description: String, inv_type: libremetaverse_types::InventoryType, transaction_id: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<libremetaverse::InventoryItem>, crate::Error> shared_self,owned,owned,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID,System.Collections.Generic.IEnumerable{System.ValueTuple{LibreMetaverse.InventoryBase,System.String}},System.Action{System.Boolean},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID folderID, System.Collections.Generic.IEnumerable<System.ValueTuple<LibreMetaverse.InventoryBase, System.String>> linksToCreate, System.Action<System.Boolean> callback, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::create_links pub async fn create_links(&self, folder_id: libremetaverse_types::UUID, links_to_create: Box<dyn Iterator<Item = (libremetaverse::InventoryItem, String)>>, callback: Option<Box<dyn Fn(bool) + Send + Sync>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,optional_owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID,System.Collections.Generic.IEnumerable{System.ValueTuple{LibreMetaverse.InventoryBase,System.String}},System.Action{System.Boolean},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID folderID, System.Collections.Generic.IEnumerable<System.ValueTuple<LibreMetaverse.InventoryBase, System.String>> linksToCreate, System.Action<System.Boolean> callback, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::create_links pub async fn create_links(&self, folder_id: libremetaverse_types::UUID, links_to_create: Box<dyn Iterator<Item = (libremetaverse::InventoryItem, String)>>, callback: Option<Box<dyn Fn(bool) + Send + Sync>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.CreateOrRetrieveInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID) method LibreMetaverse.InventoryItem LibreMetaverse.InventoryManager.CreateOrRetrieveInventoryItem(LibreMetaverse.InventoryType InvType, LibreMetaverse.UUID ItemID) libremetaverse libremetaverse::InventoryManager::create_or_retrieve_inventory_item pub fn create_or_retrieve_inventory_item(&self, inv_type: libremetaverse_types::InventoryType, item_id: libremetaverse_types::UUID) -> Result<libremetaverse::InventoryItem, crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.DecryptShadowID(LibreMetaverse.UUID) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.DecryptShadowID(LibreMetaverse.UUID shadowID) libremetaverse libremetaverse::InventoryManager::decrypt_shadow_id pub fn decrypt_shadow_id(shadow_id: libremetaverse_types::UUID) -> Result<libremetaverse_types::UUID, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.Dispose method System.Void LibreMetaverse.InventoryManager.Dispose() libremetaverse libremetaverse::InventoryManager::dispose pub fn dispose(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
@@ -11900,10 +11900,10 @@ M:LibreMetaverse.InventoryManager.FetchItemHttpAsync(LibreMetaverse.UUID,LibreMe
|
||||
M:LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.AssetType) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.AssetType type) libremetaverse libremetaverse::InventoryManager::find_folder_for_type_with_asset_type pub fn find_folder_for_type_with_asset_type(&self, type_: libremetaverse_types::AssetType) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
|
||||
M:LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.FolderType) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.FolderType type) libremetaverse libremetaverse::InventoryManager::find_folder_for_type_with_folder_type pub fn find_folder_for_type_with_folder_type(&self, type_: libremetaverse_types::FolderType) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
|
||||
M:LibreMetaverse.InventoryManager.FindObjectByPathAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.UUID> LibreMetaverse.InventoryManager.FindObjectByPathAsync(LibreMetaverse.UUID baseFolder, LibreMetaverse.UUID inventoryOwner, System.String path, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::find_object_by_path pub async fn find_object_by_path(&self, base_folder: libremetaverse_types::UUID, inventory_owner: libremetaverse_types::UUID, path: String, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID folder, LibreMetaverse.UUID owner, System.Boolean fetchFolders, System.Boolean fetchItems, LibreMetaverse.InventorySortOrder order, System.Threading.CancellationToken cancellationToken = default, System.Boolean followLinks = default) libremetaverse libremetaverse::InventoryManager::folder_contents pub async fn folder_contents(&self, folder: libremetaverse_types::UUID, owner: libremetaverse_types::UUID, fetch_folders: bool, fetch_items: bool, order: libremetaverse::InventorySortOrder, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, follow_links: Option<bool>) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID folder, LibreMetaverse.UUID owner, System.Boolean fetchFolders, System.Boolean fetchItems, LibreMetaverse.InventorySortOrder order, System.Threading.CancellationToken cancellationToken = default, System.Boolean followLinks = default) libremetaverse libremetaverse::InventoryManager::folder_contents pub async fn folder_contents(&self, folder: libremetaverse_types::UUID, owner: libremetaverse_types::UUID, fetch_folders: bool, fetch_items: bool, order: libremetaverse::InventorySortOrder, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, follow_links: Option<bool>) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.FolderUpdateResult.#ctor constructor LibreMetaverse.InventoryManager.FolderUpdateResult() libremetaverse libremetaverse::InventoryManagerFolderUpdateResult::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.GetInventoryRecursiveAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Collections.Generic.List{LibreMetaverse.InventoryFolder},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.InventoryManager.GetInventoryRecursiveAsync(LibreMetaverse.UUID folderID, LibreMetaverse.UUID owner, System.Collections.Generic.List<LibreMetaverse.InventoryFolder> cats, System.Collections.Generic.List<LibreMetaverse.InventoryItem> items, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::get_inventory_recursive pub async fn get_inventory_recursive(&self, folder_id: libremetaverse_types::UUID, owner: libremetaverse_types::UUID, cats: Vec<libremetaverse::InventoryFolder>, items: Vec<libremetaverse::InventoryItem>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID objectID, System.UInt32 objectLocalID, LibreMetaverse.Simulator simulator = default, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::get_task_inventory pub async fn get_task_inventory(&self, object_id: libremetaverse_types::UUID, object_local_id: u32, simulator: Option<libremetaverse::Simulator>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned,owned,optional_owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID objectID, System.UInt32 objectLocalID, LibreMetaverse.Simulator simulator = default, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::get_task_inventory pub async fn get_task_inventory(&self, object_id: libremetaverse_types::UUID, object_local_id: u32, simulator: Option<libremetaverse::Simulator>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.GiveFolderAsync(LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Boolean,System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.InventoryManager.GiveFolderAsync(LibreMetaverse.UUID folderID, System.String folderName, LibreMetaverse.UUID recipient, System.Boolean doEffect, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::give_folder pub async fn give_folder(&self, folder_id: libremetaverse_types::UUID, folder_name: String, recipient: libremetaverse_types::UUID, do_effect: bool, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.GiveItem(LibreMetaverse.UUID,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,System.Boolean) method System.Void LibreMetaverse.InventoryManager.GiveItem(LibreMetaverse.UUID itemID, System.String itemName, LibreMetaverse.AssetType assetType, LibreMetaverse.UUID recipient, System.Boolean doEffect) libremetaverse libremetaverse::InventoryManager::give_item pub fn give_item(&self, item_id: libremetaverse_types::UUID, item_name: String, asset_type: libremetaverse_types::AssetType, recipient: libremetaverse_types::UUID, do_effect: bool) -> Result<(), crate::Error> shared_self,owned,owned,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem) method System.UInt32 LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem iitem) libremetaverse libremetaverse::InventoryManager::item_crc pub fn item_crc(iitem: &libremetaverse::InventoryItem) -> Result<u32, crate::Error> shared_borrow sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
@@ -24948,8 +24948,8 @@ M:LibreMetaverse.TerrainCompressor.DecodePatchHeader(LibreMetaverse.BitPack,Syst
|
||||
M:LibreMetaverse.TerrainCompressor.DecompressPatch(System.Int32[],LibreMetaverse.TerrainPatch.Header,LibreMetaverse.TerrainPatch.GroupHeader) method System.Single[] LibreMetaverse.TerrainCompressor.DecompressPatch(System.Int32[] patches, LibreMetaverse.TerrainPatch.Header header, LibreMetaverse.TerrainPatch.GroupHeader group) libremetaverse libremetaverse::TerrainCompressor::decompress_patch pub fn decompress_patch(patches: Vec<i32>, header: libremetaverse::TerrainPatchHeader, group: libremetaverse::TerrainPatchGroupHeader) -> Result<Vec<f32>, crate::Error> owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.TerrainManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::TerrainManager::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainManager.Dispose method System.Void LibreMetaverse.TerrainManager.Dispose() libremetaverse libremetaverse::TerrainManager::dispose pub fn dispose(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.Assets.AssetMaterial[]> LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::get_terrain_material_overrides pub async fn get_terrain_material_overrides(&self, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<Vec<Option<libremetaverse::assets::AssetMaterial>>>, crate::Error> shared_self,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[] overrides, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::set_terrain_material_overrides pub async fn set_terrain_material_overrides(&self, overrides: Vec<Option<libremetaverse::assets::AssetMaterial>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.Assets.AssetMaterial[]> LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::get_terrain_material_overrides pub async fn get_terrain_material_overrides(&self, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<Vec<Option<libremetaverse::assets::AssetMaterial>>>, crate::Error> shared_self,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[] overrides, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::set_terrain_material_overrides pub async fn set_terrain_material_overrides(&self, overrides: Vec<Option<libremetaverse::assets::AssetMaterial>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainPatch.#ctor constructor LibreMetaverse.TerrainPatch() libremetaverse libremetaverse::TerrainPatch::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerrainPatch.Header.setPatchIDs(System.Int32,System.Int32) method System.Int32 LibreMetaverse.TerrainPatch.Header.setPatchIDs(System.Int32 xx, System.Int32 yy) libremetaverse libremetaverse::TerrainPatchHeader::set_patch_i_ds pub fn set_patch_i_ds(&mut self, xx: i32, yy: i32) -> Result<i32, crate::Error> mutable_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
M:LibreMetaverse.TerseObjectUpdateEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.Primitive,LibreMetaverse.ObjectMovementUpdate,System.UInt16) constructor LibreMetaverse.TerseObjectUpdateEventArgs(LibreMetaverse.Simulator simulator, LibreMetaverse.Primitive prim, LibreMetaverse.ObjectMovementUpdate update, System.UInt16 timeDilation) libremetaverse libremetaverse::TerseObjectUpdateEventArgs::new pub fn new(simulator: libremetaverse::Simulator, prim: libremetaverse::Primitive, update: libremetaverse::ObjectMovementUpdate, time_dilation: u16) -> Result<Self, crate::Error> owned,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
@@ -26181,7 +26181,7 @@ P:LibreMetaverse.EventQueueRunningEventArgs.Simulator property LibreMetaverse.Si
|
||||
P:LibreMetaverse.ExperienceInfoEventArgs.ExperienceInfo property LibreMetaverse.Messages.Linden.ExperienceInfoMessage LibreMetaverse.ExperienceInfoEventArgs.ExperienceInfo libremetaverse libremetaverse::ExperienceInfoEventArgs::experience_info pub fn experience_info(&self) -> libremetaverse::messages::linden::ExperienceInfoMessage shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
|
||||
P:LibreMetaverse.ExperiencePreferencesEventArgs.Preferences property LibreMetaverse.Messages.Linden.ExperiencePreferencesMessage LibreMetaverse.ExperiencePreferencesEventArgs.Preferences libremetaverse libremetaverse::ExperiencePreferencesEventArgs::preferences pub fn preferences(&self) -> libremetaverse::messages::linden::ExperiencePreferencesMessage shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
|
||||
P:LibreMetaverse.ExpiringCache`2.Count property System.Int32 LibreMetaverse.ExpiringCache<TKey, TValue>.Count libremetaverse-types libremetaverse_types::ExpiringCache::count pub fn count(&self) -> i32 shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
|
||||
P:LibreMetaverse.ExpiringCache`2.Item(`0) indexer System.Object LibreMetaverse.ExpiringCache<TKey, TValue>.Item libremetaverse-types libremetaverse_types::ExpiringCache::item pub fn item(&self, key: TKey) -> Option<TValue> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||
P:LibreMetaverse.ExpiringCache`2.Item(`0) indexer System.Object LibreMetaverse.ExpiringCache<TKey, TValue>.Item libremetaverse-types libremetaverse_types::ExpiringCache::item pub fn item(&self, key: TKey) -> Option<TValue> shared_self,owned sync none direct_snake_case method mapped
|
||||
P:LibreMetaverse.FindObjectByPathReplyEventArgs.InventoryObjectID property LibreMetaverse.UUID LibreMetaverse.FindObjectByPathReplyEventArgs.InventoryObjectID libremetaverse libremetaverse::FindObjectByPathReplyEventArgs::inventory_object_id pub fn inventory_object_id(&self) -> libremetaverse_types::UUID shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
|
||||
P:LibreMetaverse.FindObjectByPathReplyEventArgs.Path property System.String LibreMetaverse.FindObjectByPathReplyEventArgs.Path libremetaverse libremetaverse::FindObjectByPathReplyEventArgs::path pub fn path(&self) -> String shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
|
||||
P:LibreMetaverse.FolderUpdatedEventArgs.FolderID property LibreMetaverse.UUID LibreMetaverse.FolderUpdatedEventArgs.FolderID libremetaverse libremetaverse::FolderUpdatedEventArgs::folder_id pub fn folder_id(&self) -> libremetaverse_types::UUID shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
|
||||
|
||||
|
Can't render this file because it is too large.
|
56
api/SEMVER-AUDIT.md
Normal file
56
api/SEMVER-AUDIT.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# First-release API and SemVer audit
|
||||
|
||||
Generated by `metacrate-ci-matrix api-baseline-write`; do not edit by hand.
|
||||
|
||||
The compatibility source is pinned at [`2aa70bb68513b39795da5d13c88f31b86e85a3ba`](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba). The baseline version is `0.0.1`.
|
||||
|
||||
## Coverage and quality decisions
|
||||
|
||||
- Mapped/exported public types: **3066 / 3066**; unexplained mappings: **0**.
|
||||
- Mapped/exported public members: **30789 / 30789**; duplicate destinations: **0**.
|
||||
- Rust naming and ownership: mapped function/constant names follow Rust conventions and every member uses a reviewed ownership term.
|
||||
- External signature types: **142**; referenced support traits: **2**; accidental dependency types exposed by mapped signatures or public Rust declarations: **0**.
|
||||
- Intentional delegate APM replacements: **80**; each uses a native callback and is compiled by the downstream fixture.
|
||||
- Descriptively named overloads: **7151**; names remain fixed by the mapping ledger.
|
||||
- Native `async fn` mappings: **334**; boxed object-safe trait futures with explicit `Send`: **26**.
|
||||
- Callback signatures requiring `Send + Sync`: **137**; reviewed dyn-compatible thread-safe boundary traits: **6** (`IGridClient`, `IBakingTextureProvider`, `ICurrentOutfitPolicy`, `IRlvActionCallbacks`, `IRlvQueryCallbacks`, and `IVoiceLogger`).
|
||||
- C# enum mappings: **243** (46 unknown-bit-retaining flag types); stable public error enums marked `non_exhaustive`: **7**.
|
||||
|
||||
## Crate baselines
|
||||
|
||||
| Crate | Mapped types | Mapped members | Rust declarations | Features | Declaration SHA-256 |
|
||||
| --- | ---: | ---: | ---: | --- | --- |
|
||||
| `libremetaverse` | 2711 | 27281 | 24505 | dds-bc67, default, jpeg2000, vorbis | `6eb9365e6833584b741afdb9816ec911f4d922aba561daedc0877d711de474b3` |
|
||||
| `libremetaverse-types` | 45 | 942 | 871 | none | `c5ea3a9cab936bbb4c7fa527753ba5608de0115f13f5c59ad6a7c549dc0d97ca` |
|
||||
| `libremetaverse-structured-data` | 16 | 295 | 304 | none | `b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3` |
|
||||
| `libremetaverse-imaging` | 3 | 20 | 63 | default, jpeg2000 | `bc3f5cf5a8f472b3d4092032be35202787f443f06a4998fe2533e21aadef2e86` |
|
||||
| `libremetaverse-imaging-skia` | 1 | 3 | 13 | default, skia | `a6a1445725410a036204496ad4953c84dcfea1e6a00390ce4e10d12d36f2876b` |
|
||||
| `libremetaverse-prim-mesher` | 17 | 207 | 117 | none | `dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415` |
|
||||
| `libremetaverse-rendering-simple` | 1 | 6 | 12 | none | `4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad` |
|
||||
| `libremetaverse-rendering-mesh-foundry` | 1 | 14 | 25 | none | `3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896` |
|
||||
| `libremetaverse-lsl-tools` | 164 | 768 | 870 | none | `030c2418e08b6ea73878ba7d9c3f6983df9d3d32dda46e298fb6755a9f7e9599` |
|
||||
| `libremetaverse-rlv` | 28 | 499 | 301 | none | `f2e0a4fd808f5bb4e646a92205bac0cfe60497f0888a3ffe9a5a0fcb5dd4250a` |
|
||||
| `libremetaverse-utilities` | 3 | 13 | 17 | none | `0a3cedfd67031ae890295206a7451b9b4945c16b5fac5d4dce86384fc4524595` |
|
||||
| `libremetaverse-voice-vivox` | 64 | 531 | 382 | none | `97d0ee1665140421477427115aa961c4ebcd4e80ed8b0e625373fe86d9857899` |
|
||||
| `libremetaverse-voice-webrtc` | 12 | 210 | 290 | default, real-audio | `08ec9c36f47c51d0ae51089097887898f272417ae3ef410faa9a56f96337c470` |
|
||||
| `libremetaverse-openjpeg` | 0 | 0 | 64 | none | `9967a29eb406c56afd2a2189e1395efb073c52d2a86cc5958a419cf67de0658b` |
|
||||
| `libremetaverse-opus` | 0 | 0 | 9 | none | `c474538b08ecbb7d178d5ba63c5d15f21d8647b01f49654dc5c83ac1e691ea47` |
|
||||
|
||||
The exact mapping, exported-marker, feature, and normalized Rust declaration hashes are stored in [`SEMVER-BASELINE.json`](SEMVER-BASELINE.json). A change must be reviewed and classified before the baseline is re-recorded.
|
||||
|
||||
## Intentional Rust migration recipes
|
||||
|
||||
- C# `PascalCase` methods/properties become Rust `snake_case`; overloads use the ledger's stable descriptive suffix, never argument-count dispatch.
|
||||
- C# reference ownership becomes owned values, shared or mutable borrows, `Arc`-backed managers, and explicit optional values as recorded per member.
|
||||
- `Task<T>` becomes `async fn -> Result<T, Error>`; object-safe async traits return `Pin<Box<dyn Future<Output = Result<...>> + Send + '_>>`.
|
||||
- .NET events become `subscribe_*` calls returning an owned `Subscription`; callbacks are `Send + Sync` and dispatch outside internal locks.
|
||||
- `IDisposable` becomes explicit idempotent shutdown plus `Drop`; cancellation remains a typed `Error::Cancelled`.
|
||||
- Closed C# enums retain fixed discriminants and are SemVer-breaking to extend; flags retain unknown bits, while public Rust error enums are `non_exhaustive`.
|
||||
- Optional native backends remain feature-gated (`jpeg2000`, `skia`, `vorbis`, `real-audio`); default and empty-default sets are part of the baseline.
|
||||
- Capability HTTP injection uses project-owned `HttpMessageHandler`, `CapsHttpLimits`, and `with_native_transport`; the internal `reqwest` client is not part of the public surface.
|
||||
- External C# signature types map to core/std, adopted cross-platform crates, or project-owned boundary types; no third-party crate path leaks through mapped signatures or public Rust declarations.
|
||||
|
||||
## Compile consumers
|
||||
|
||||
- `tests/api-compile` compiles every mapped type/member from a standalone downstream workspace.
|
||||
- `tests/semver-port` is a runnable representative port covering lifecycle, value types, structured data, imaging, RLV, cancellation, dyn trait, and `Send`/`Sync` contracts without network access.
|
||||
189
api/SEMVER-BASELINE.json
Normal file
189
api/SEMVER-BASELINE.json
Normal file
@@ -0,0 +1,189 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"release": "0.0.1",
|
||||
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||
"mapped_public_types": 3066,
|
||||
"mapped_members": 30789,
|
||||
"external_signature_types": 142,
|
||||
"support_traits": 2,
|
||||
"intentional_differences": 80,
|
||||
"descriptive_overloads": 7151,
|
||||
"async_functions": 334,
|
||||
"send_boxed_futures": 26,
|
||||
"thread_safe_callbacks": 137,
|
||||
"thread_safe_dyn_traits": 6,
|
||||
"non_exhaustive_error_enums": 7,
|
||||
"enum_types": 243,
|
||||
"bitflag_types": 46,
|
||||
"unexplained_mappings": 0,
|
||||
"accidental_public_dependency_types": 0,
|
||||
"type_mapping_sha256": "21025889c62b0f8666a2dda46a03ff4f28931f51156927822a1c04e97b49f221",
|
||||
"member_mapping_sha256": "14a40b155c93a8d3def627e1774464b1f710e6857ed249145ed63304ed684ac8",
|
||||
"exported_mapping_sha256": "5b8a502ce229d26732744f2b44c029fc4a86b403966dc2f9b4a1c913a7b242b9",
|
||||
"rust_declaration_sha256": "99ea016ab97a4c195f045fc6c22a0a76a5616f436c485bfd7e82568177762219",
|
||||
"crates": [
|
||||
{
|
||||
"name": "libremetaverse",
|
||||
"version": "0.0.1",
|
||||
"features": {
|
||||
"dds-bc67": [
|
||||
"dep:bcdec_rs"
|
||||
],
|
||||
"default": [
|
||||
"dds-bc67"
|
||||
],
|
||||
"jpeg2000": [
|
||||
"libremetaverse-imaging/jpeg2000"
|
||||
],
|
||||
"vorbis": [
|
||||
"dep:vorbis_rs"
|
||||
]
|
||||
},
|
||||
"mapped_types": 2711,
|
||||
"mapped_members": 27281,
|
||||
"public_declarations": 24505,
|
||||
"declaration_sha256": "6eb9365e6833584b741afdb9816ec911f4d922aba561daedc0877d711de474b3"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-types",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 45,
|
||||
"mapped_members": 942,
|
||||
"public_declarations": 871,
|
||||
"declaration_sha256": "c5ea3a9cab936bbb4c7fa527753ba5608de0115f13f5c59ad6a7c549dc0d97ca"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-structured-data",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 16,
|
||||
"mapped_members": 295,
|
||||
"public_declarations": 304,
|
||||
"declaration_sha256": "b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-imaging",
|
||||
"version": "0.0.1",
|
||||
"features": {
|
||||
"default": [],
|
||||
"jpeg2000": [
|
||||
"dep:libremetaverse-openjpeg"
|
||||
]
|
||||
},
|
||||
"mapped_types": 3,
|
||||
"mapped_members": 20,
|
||||
"public_declarations": 63,
|
||||
"declaration_sha256": "bc3f5cf5a8f472b3d4092032be35202787f443f06a4998fe2533e21aadef2e86"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-imaging-skia",
|
||||
"version": "0.0.1",
|
||||
"features": {
|
||||
"default": [],
|
||||
"skia": [
|
||||
"dep:skia-safe"
|
||||
]
|
||||
},
|
||||
"mapped_types": 1,
|
||||
"mapped_members": 3,
|
||||
"public_declarations": 13,
|
||||
"declaration_sha256": "a6a1445725410a036204496ad4953c84dcfea1e6a00390ce4e10d12d36f2876b"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-prim-mesher",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 17,
|
||||
"mapped_members": 207,
|
||||
"public_declarations": 117,
|
||||
"declaration_sha256": "dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-rendering-simple",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 1,
|
||||
"mapped_members": 6,
|
||||
"public_declarations": 12,
|
||||
"declaration_sha256": "4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-rendering-mesh-foundry",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 1,
|
||||
"mapped_members": 14,
|
||||
"public_declarations": 25,
|
||||
"declaration_sha256": "3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-lsl-tools",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 164,
|
||||
"mapped_members": 768,
|
||||
"public_declarations": 870,
|
||||
"declaration_sha256": "030c2418e08b6ea73878ba7d9c3f6983df9d3d32dda46e298fb6755a9f7e9599"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-rlv",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 28,
|
||||
"mapped_members": 499,
|
||||
"public_declarations": 301,
|
||||
"declaration_sha256": "f2e0a4fd808f5bb4e646a92205bac0cfe60497f0888a3ffe9a5a0fcb5dd4250a"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-utilities",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 3,
|
||||
"mapped_members": 13,
|
||||
"public_declarations": 17,
|
||||
"declaration_sha256": "0a3cedfd67031ae890295206a7451b9b4945c16b5fac5d4dce86384fc4524595"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-voice-vivox",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 64,
|
||||
"mapped_members": 531,
|
||||
"public_declarations": 382,
|
||||
"declaration_sha256": "97d0ee1665140421477427115aa961c4ebcd4e80ed8b0e625373fe86d9857899"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-voice-webrtc",
|
||||
"version": "0.0.1",
|
||||
"features": {
|
||||
"default": [],
|
||||
"real-audio": [
|
||||
"dep:cpal"
|
||||
]
|
||||
},
|
||||
"mapped_types": 12,
|
||||
"mapped_members": 210,
|
||||
"public_declarations": 290,
|
||||
"declaration_sha256": "08ec9c36f47c51d0ae51089097887898f272417ae3ef410faa9a56f96337c470"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-openjpeg",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 0,
|
||||
"mapped_members": 0,
|
||||
"public_declarations": 64,
|
||||
"declaration_sha256": "9967a29eb406c56afd2a2189e1395efb073c52d2a86cc5958a419cf67de0658b"
|
||||
},
|
||||
{
|
||||
"name": "libremetaverse-opus",
|
||||
"version": "0.0.1",
|
||||
"features": {},
|
||||
"mapped_types": 0,
|
||||
"mapped_members": 0,
|
||||
"public_declarations": 9,
|
||||
"declaration_sha256": "c474538b08ecbb7d178d5ba63c5d15f21d8647b01f49654dc5c83ac1e691ea47"
|
||||
}
|
||||
]
|
||||
}
|
||||
16
ci/evidence/api-audit.json
Normal file
16
ci/evidence/api-audit.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"release": "0.0.1",
|
||||
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||
"baseline_sha256": "9792357b40cd1cd888722dff2f97f19fbdc33a63d23c5bc451b717b17884a4e6",
|
||||
"mapped_public_types": 3066,
|
||||
"mapped_members": 30789,
|
||||
"intentional_differences": 80,
|
||||
"unexplained_mappings": 0,
|
||||
"accidental_public_dependency_types": 0,
|
||||
"thread_safe_dyn_traits": 6,
|
||||
"non_exhaustive_error_enums": 7,
|
||||
"downstream_compile_fixture": "tests/api-compile",
|
||||
"representative_port": "tests/semver-port",
|
||||
"status": "ok"
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
"documented_members": 30789,
|
||||
"tested_rust_snippets": 5,
|
||||
"linked_programs": 9,
|
||||
"checked_local_links": 65,
|
||||
"checked_local_links": 69,
|
||||
"required_guide_sections": 11,
|
||||
"status": "ok"
|
||||
}
|
||||
|
||||
@@ -501,6 +501,7 @@ const fn map_decode_error(error: openjpeg::Error) -> Error {
|
||||
openjpeg::Error::LimitExceeded => Error::Argument,
|
||||
openjpeg::Error::Allocation => Error::InvalidOperation,
|
||||
openjpeg::Error::InvalidInput | openjpeg::Error::Codec => parse("JPEG 2000 codestream"),
|
||||
_ => parse("JPEG 2000 backend"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,6 +509,7 @@ const fn map_encode_error(error: openjpeg::Error) -> Error {
|
||||
match error {
|
||||
openjpeg::Error::InvalidInput | openjpeg::Error::LimitExceeded => Error::Argument,
|
||||
openjpeg::Error::Allocation | openjpeg::Error::Codec => Error::InvalidOperation,
|
||||
_ => Error::InvalidOperation,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ pub struct ComponentRef<'a> {
|
||||
|
||||
/// Stable error categories; `OpenJPEG` diagnostics never cross the safe API.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
InvalidInput,
|
||||
LimitExceeded,
|
||||
|
||||
@@ -30,6 +30,7 @@ pub struct RlvSourceSpan {
|
||||
|
||||
/// Stable malformed-input categories exposed by the native parser.
|
||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum RlvParseErrorKind {
|
||||
MessageTooLong,
|
||||
MissingPrefix,
|
||||
|
||||
@@ -1133,7 +1133,7 @@ pub use crate::enum_compat::EnumInfoExtensions;
|
||||
///
|
||||
/// C# signature: `System.Object LibreMetaverse.ExpiringCache<TKey, TValue>.Item`.
|
||||
/// Mapping contract: ownership `shared_self,owned`; async `sync`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
/// errors `none`; overload `direct_snake_case`; kind `method`.
|
||||
pub use crate::collections::ExpiringCache;
|
||||
|
||||
/// C# type: `T:LibreMetaverse.ExtraParamType`.
|
||||
|
||||
@@ -44,6 +44,7 @@ impl std::error::Error for NotImplemented {}
|
||||
|
||||
/// Shared error contract for translated fallible APIs.
|
||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum Error {
|
||||
/// The API surface exists but its production body has not been ported yet.
|
||||
NotImplemented(NotImplemented),
|
||||
|
||||
@@ -157,6 +157,7 @@ impl fmt::Debug for VivoxEvent {
|
||||
|
||||
/// Failure from the native Vivox control protocol.
|
||||
#[derive(Debug)]
|
||||
#[non_exhaustive]
|
||||
pub enum VivoxError {
|
||||
/// TCP or stream I/O failed.
|
||||
Io(io::Error),
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
///
|
||||
/// Native Rust mapping of C# `LibreMetaverse.Voice.WebRTC.IVoiceLogger` using decision
|
||||
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||
pub trait IVoiceLogger {
|
||||
pub trait IVoiceLogger: Send + Sync {
|
||||
/// C# member: `M:LibreMetaverse.Voice.WebRTC.IVoiceLogger.Debug(System.String,LibreMetaverse.GridClient)`.
|
||||
///
|
||||
/// C# signature: `System.Void LibreMetaverse.Voice.WebRTC.IVoiceLogger.Debug(System.String message, LibreMetaverse.GridClient client = default)`.
|
||||
|
||||
@@ -42,6 +42,7 @@ const MAX_DATA_BYTES: usize = 64 * 1024;
|
||||
|
||||
/// Errors produced by the native WebRTC adapter.
|
||||
#[derive(Debug)]
|
||||
#[non_exhaustive]
|
||||
pub enum WebRtcError {
|
||||
InvalidInput(&'static str),
|
||||
Io(std::io::Error),
|
||||
|
||||
@@ -557,7 +557,7 @@ struct HttpCapsClientInner {
|
||||
disposed: AtomicBool,
|
||||
}
|
||||
|
||||
/// Native capability HTTP client with injectable fake and reqwest backends.
|
||||
/// Native capability HTTP client with injectable fake and production backends.
|
||||
#[derive(Clone)]
|
||||
pub struct HttpCapsClient(Arc<HttpCapsClientInner>);
|
||||
|
||||
@@ -614,24 +614,47 @@ impl HttpCapsClient {
|
||||
})))
|
||||
}
|
||||
|
||||
pub fn with_reqwest_client(
|
||||
client: reqwest::Client,
|
||||
/// Creates the production HTTP backend without exposing the selected HTTP
|
||||
/// implementation in the public API.
|
||||
pub fn with_native_transport(
|
||||
user_agent: &str,
|
||||
timeout: Duration,
|
||||
max_connections: usize,
|
||||
rate_limiter: Option<CapsRateLimiter>,
|
||||
limits: CapsHttpLimits,
|
||||
) -> Result<Self, Error> {
|
||||
Self::with_reqwest_client_and_concurrency(client, rate_limiter, limits, 32)
|
||||
if timeout.is_zero() || max_connections == 0 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
limits.validate()?;
|
||||
let max_redirects = limits.max_redirects;
|
||||
let redirect = reqwest::redirect::Policy::custom(move |attempt| {
|
||||
if attempt.previous().len() >= max_redirects {
|
||||
return attempt.stop();
|
||||
}
|
||||
match attempt.url().scheme() {
|
||||
"http" | "https" => attempt.follow(),
|
||||
_ => attempt.stop(),
|
||||
}
|
||||
});
|
||||
let client = reqwest::Client::builder()
|
||||
.redirect(redirect)
|
||||
.timeout(timeout)
|
||||
.connect_timeout(timeout)
|
||||
.pool_max_idle_per_host(max_connections)
|
||||
.user_agent(user_agent)
|
||||
.build()
|
||||
.map_err(|_| Error::HttpRequest)?;
|
||||
Self::with_reqwest_client(client, rate_limiter, limits, max_connections)
|
||||
}
|
||||
|
||||
fn with_reqwest_client_and_concurrency(
|
||||
fn with_reqwest_client(
|
||||
client: reqwest::Client,
|
||||
rate_limiter: Option<CapsRateLimiter>,
|
||||
limits: CapsHttpLimits,
|
||||
max_connections: usize,
|
||||
) -> Result<Self, Error> {
|
||||
limits.validate()?;
|
||||
if max_connections == 0 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
Ok(Self(Arc::new(HttpCapsClientInner {
|
||||
backend: HttpBackend::Reqwest(client),
|
||||
limits,
|
||||
@@ -648,33 +671,12 @@ impl HttpCapsClient {
|
||||
max_connections: usize,
|
||||
rate_limiter: CapsRateLimiter,
|
||||
) -> Result<Self, Error> {
|
||||
if max_connections == 0 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
let limits = CapsHttpLimits::default();
|
||||
let max_redirects = limits.max_redirects;
|
||||
let redirect = reqwest::redirect::Policy::custom(move |attempt| {
|
||||
if attempt.previous().len() > max_redirects {
|
||||
return attempt.stop();
|
||||
}
|
||||
match attempt.url().scheme() {
|
||||
"http" | "https" => attempt.follow(),
|
||||
_ => attempt.stop(),
|
||||
}
|
||||
});
|
||||
let client = reqwest::Client::builder()
|
||||
.redirect(redirect)
|
||||
.timeout(timeout)
|
||||
.connect_timeout(timeout)
|
||||
.pool_max_idle_per_host(max_connections)
|
||||
.user_agent(user_agent)
|
||||
.build()
|
||||
.map_err(|_| Error::HttpRequest)?;
|
||||
Self::with_reqwest_client_and_concurrency(
|
||||
client,
|
||||
Some(rate_limiter),
|
||||
limits,
|
||||
Self::with_native_transport(
|
||||
user_agent,
|
||||
timeout,
|
||||
max_connections,
|
||||
Some(rate_limiter),
|
||||
CapsHttpLimits::default(),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ use std::sync::{Arc, Condvar, Mutex};
|
||||
|
||||
/// A validated client-core failure with no credential or capability payload.
|
||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum ClientCoreError {
|
||||
/// A public settings field failed validation.
|
||||
InvalidConfiguration {
|
||||
|
||||
@@ -17035,7 +17035,7 @@ pub trait IBakingTextureProvider: std::any::Any + Send + Sync {
|
||||
///
|
||||
/// Native Rust mapping of C# `LibreMetaverse.IGridClient` using decision
|
||||
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||
pub trait IGridClient {
|
||||
pub trait IGridClient: Send + Sync {
|
||||
/// C# member: `P:LibreMetaverse.IGridClient.AisClient`.
|
||||
///
|
||||
/// C# signature: `LibreMetaverse.InventoryAISClient LibreMetaverse.IGridClient.AisClient`.
|
||||
@@ -19408,7 +19408,7 @@ impl InventoryManager {
|
||||
/// C# member: `M:LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID,System.Collections.Generic.IEnumerable{System.ValueTuple{LibreMetaverse.InventoryBase,System.String}},System.Action{System.Boolean},System.Threading.CancellationToken)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task LibreMetaverse.InventoryManager.CreateLinksAsync(LibreMetaverse.UUID folderID, System.Collections.Generic.IEnumerable<System.ValueTuple<LibreMetaverse.InventoryBase, System.String>> linksToCreate, System.Action<System.Boolean> callback, System.Threading.CancellationToken cancellationToken = default)`.
|
||||
/// Mapping contract: ownership `shared_self,owned,owned,optional_owned,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,owned,owned,optional_owned,optional_owned`; async `async`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
pub async fn create_links(
|
||||
&self,
|
||||
@@ -19562,7 +19562,7 @@ impl InventoryManager {
|
||||
/// C# member: `M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID folder, LibreMetaverse.UUID owner, System.Boolean fetchFolders, System.Boolean fetchItems, LibreMetaverse.InventorySortOrder order, System.Threading.CancellationToken cancellationToken = default, System.Boolean followLinks = default)`.
|
||||
/// Mapping contract: ownership `shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned`; async `async`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
pub async fn folder_contents(
|
||||
&self,
|
||||
@@ -19604,7 +19604,7 @@ impl InventoryManager {
|
||||
/// C# member: `M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID objectID, System.UInt32 objectLocalID, LibreMetaverse.Simulator simulator = default, System.Threading.CancellationToken cancellationToken = default)`.
|
||||
/// Mapping contract: ownership `shared_self,owned,owned,optional_owned,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,owned,owned,optional_owned,optional_owned`; async `async`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
pub async fn get_task_inventory(
|
||||
&self,
|
||||
@@ -35686,12 +35686,12 @@ pub use crate::terrain_codec::TerrainCompressor;
|
||||
/// C# member: `M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task<LibreMetaverse.Assets.AssetMaterial[]> LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken cancellationToken = default)`.
|
||||
/// Mapping contract: ownership `shared_self,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,optional_owned`; async `async`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
/// C# member: `M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[] overrides, System.Threading.CancellationToken cancellationToken = default)`.
|
||||
/// Mapping contract: ownership `shared_self,owned,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,owned,optional_owned`; async `async`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
pub use crate::terrain_manager::TerrainManager;
|
||||
|
||||
@@ -37970,7 +37970,7 @@ pub mod appearance {
|
||||
/// C# member: `M:LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task LibreMetaverse.Appearance.CompositeCurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List<LibreMetaverse.InventoryItem> addedItems, System.Collections.Generic.List<LibreMetaverse.InventoryItem> removedItems, System.Threading.CancellationToken cancellationToken = default)`.
|
||||
/// Mapping contract: ownership `shared_self,optional_shared,optional_shared,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,optional_shared,optional_shared,optional_owned`; async `async`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
pub async fn report_item_change(
|
||||
&self,
|
||||
@@ -38273,7 +38273,7 @@ pub mod appearance {
|
||||
/// C# member: `M:LibreMetaverse.Appearance.ICurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken)`.
|
||||
///
|
||||
/// C# signature: `System.Threading.Tasks.Task LibreMetaverse.Appearance.ICurrentOutfitPolicy.ReportItemChangeAsync(System.Collections.Generic.List<LibreMetaverse.InventoryItem> addedItems, System.Collections.Generic.List<LibreMetaverse.InventoryItem> removedItems, System.Threading.CancellationToken cancellationToken = default)`.
|
||||
/// Mapping contract: ownership `shared_self,optional_shared,optional_shared,optional_owned`; async `sync`;
|
||||
/// Mapping contract: ownership `shared_self,optional_shared,optional_shared,optional_owned`; async `boxed_future`;
|
||||
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||
fn report_item_change(
|
||||
&self,
|
||||
|
||||
@@ -29,6 +29,7 @@ const THROTTLE_BURST_PERIODS: usize = 4;
|
||||
/// The variants deliberately carry no datagram bytes, credentials, endpoint
|
||||
/// query data, or operating-system error strings.
|
||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||
#[non_exhaustive]
|
||||
pub enum UdpTransportError {
|
||||
InvalidConfiguration(&'static str),
|
||||
InvalidBuffer,
|
||||
|
||||
@@ -797,8 +797,32 @@ async fn read_http_request(stream: &mut tokio::net::TcpStream) -> Vec<u8> {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn native_transport_rejects_invalid_resource_policy_before_building() {
|
||||
assert!(matches!(
|
||||
HttpCapsClient::with_native_transport(
|
||||
"MetaCrate-caps-test/0.0.1",
|
||||
Duration::ZERO,
|
||||
1,
|
||||
None,
|
||||
CapsHttpLimits::default(),
|
||||
),
|
||||
Err(Error::Argument)
|
||||
));
|
||||
assert!(matches!(
|
||||
HttpCapsClient::with_native_transport(
|
||||
"MetaCrate-caps-test/0.0.1",
|
||||
Duration::from_secs(1),
|
||||
0,
|
||||
None,
|
||||
CapsHttpLimits::default(),
|
||||
),
|
||||
Err(Error::Argument)
|
||||
));
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn injected_reqwest_backend_follows_redirects_streams_and_decompresses() {
|
||||
async fn native_http_backend_follows_redirects_streams_and_decompresses() {
|
||||
let listener = tokio::net::TcpListener::bind((std::net::Ipv4Addr::LOCALHOST, 0))
|
||||
.await
|
||||
.expect("bind fake server");
|
||||
@@ -842,12 +866,10 @@ async fn injected_reqwest_backend_follows_redirects_streams_and_decompresses() {
|
||||
}
|
||||
});
|
||||
|
||||
let reqwest = reqwest::Client::builder()
|
||||
.redirect(reqwest::redirect::Policy::limited(3))
|
||||
.build()
|
||||
.expect("reqwest client");
|
||||
let client = HttpCapsClient::with_reqwest_client(
|
||||
reqwest,
|
||||
let client = HttpCapsClient::with_native_transport(
|
||||
"MetaCrate-caps-test/0.0.1",
|
||||
Duration::from_secs(5),
|
||||
4,
|
||||
None,
|
||||
CapsHttpLimits {
|
||||
max_request_bytes: 1_024,
|
||||
|
||||
3187
tests/semver-port/Cargo.lock
generated
Normal file
3187
tests/semver-port/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
17
tests/semver-port/Cargo.toml
Normal file
17
tests/semver-port/Cargo.toml
Normal file
@@ -0,0 +1,17 @@
|
||||
[package]
|
||||
name = "metacrate-semver-port"
|
||||
version = "0.0.0"
|
||||
edition = "2024"
|
||||
rust-version = "1.96"
|
||||
license = "BSD-3-Clause"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
libremetaverse = { path = "../../crates/libremetaverse" }
|
||||
libremetaverse-imaging = { path = "../../crates/libremetaverse-imaging" }
|
||||
libremetaverse-rlv = { path = "../../crates/libremetaverse-rlv" }
|
||||
libremetaverse-structured-data = { path = "../../crates/libremetaverse-structured-data" }
|
||||
libremetaverse-types = { path = "../../crates/libremetaverse-types" }
|
||||
libremetaverse-voice-webrtc = { path = "../../crates/libremetaverse-voice-webrtc" }
|
||||
|
||||
[workspace]
|
||||
72
tests/semver-port/src/main.rs
Normal file
72
tests/semver-port/src/main.rs
Normal file
@@ -0,0 +1,72 @@
|
||||
use libremetaverse::appearance::ICurrentOutfitPolicy;
|
||||
use libremetaverse::{
|
||||
CapsHttpLimits, GridClient, HttpCapsClient, IBakingTextureProvider, IGridClient,
|
||||
};
|
||||
use libremetaverse_imaging::{ManagedImage, ManagedImageImageChannels};
|
||||
use libremetaverse_rlv::{IRlvActionCallbacks, IRlvQueryCallbacks, RlvParser};
|
||||
use libremetaverse_structured_data::OSD;
|
||||
use libremetaverse_types::UUID;
|
||||
use libremetaverse_types::compat::CancellationTokenSource;
|
||||
use libremetaverse_voice_webrtc::IVoiceLogger;
|
||||
use std::future::Future;
|
||||
use std::time::Duration;
|
||||
|
||||
fn assert_send_sync<T: Send + Sync>() {}
|
||||
|
||||
fn assert_send_future<T: Future + Send>(future: T) {
|
||||
drop(future);
|
||||
}
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
fn assert_dyn_compatible(
|
||||
_grid: Option<&dyn IGridClient>,
|
||||
_baker: Option<&dyn IBakingTextureProvider>,
|
||||
_outfit: Option<&dyn ICurrentOutfitPolicy>,
|
||||
_actions: Option<&dyn IRlvActionCallbacks>,
|
||||
_queries: Option<&dyn IRlvQueryCallbacks>,
|
||||
_logger: Option<&dyn IVoiceLogger>,
|
||||
) {
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
assert_send_sync::<GridClient>();
|
||||
assert_send_sync::<CancellationTokenSource>();
|
||||
assert_dyn_compatible(None, None, None, None, None, None);
|
||||
assert_send_sync::<Box<dyn IGridClient>>();
|
||||
assert_send_sync::<Box<dyn IBakingTextureProvider>>();
|
||||
assert_send_sync::<Box<dyn ICurrentOutfitPolicy>>();
|
||||
assert_send_sync::<Box<dyn IRlvActionCallbacks>>();
|
||||
assert_send_sync::<Box<dyn IRlvQueryCallbacks>>();
|
||||
assert_send_sync::<Box<dyn IVoiceLogger>>();
|
||||
|
||||
let cancellation = CancellationTokenSource::new();
|
||||
let token = cancellation.token();
|
||||
assert_send_future(token.cancelled());
|
||||
cancellation.cancel();
|
||||
|
||||
let id = UUID::new_with_u_int64(103)?;
|
||||
let value = OSD::from_integer_with_int32(103)?;
|
||||
assert_eq!(value.as_integer()?, 103);
|
||||
|
||||
let image = ManagedImage::new(2, 2, ManagedImageImageChannels::COLOR)?;
|
||||
assert_eq!(image.to_interleaved(6)?.len(), 12);
|
||||
|
||||
let rlv = RlvParser::parse_message("@version=42", id.guid(), "SemVer Port")?;
|
||||
assert_eq!(rlv.commands.len(), 1);
|
||||
|
||||
let native_http = HttpCapsClient::with_native_transport(
|
||||
"MetaCrate-SemVer-Port/0.0.1",
|
||||
Duration::from_secs(1),
|
||||
1,
|
||||
None,
|
||||
CapsHttpLimits::default(),
|
||||
)?;
|
||||
drop(native_http);
|
||||
|
||||
let client = GridClient::new()?;
|
||||
let as_interface: &dyn IGridClient = &client;
|
||||
assert_eq!(as_interface.settings(), client.settings());
|
||||
assert_send_future(client.dispose_with_method_87ebceff());
|
||||
client.dispose_with_method()?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -11,6 +11,7 @@ publish = false
|
||||
[dependencies]
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
sha2 = "0.11"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
1338
tools/ci-matrix/src/api_surface.rs
Normal file
1338
tools/ci-matrix/src/api_surface.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -11,9 +11,11 @@ use std::path::{Path, PathBuf};
|
||||
use std::process::{Command, ExitStatus, Stdio};
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
mod api_surface;
|
||||
mod dependency;
|
||||
mod documentation;
|
||||
|
||||
pub use api_surface::{audit_api_surface, write_api_baseline};
|
||||
pub use dependency::audit_dependencies;
|
||||
pub use documentation::{audit_documentation, write_documentation_report};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use metacrate_ci_matrix::{
|
||||
audit, audit_dependencies, audit_documentation, load, run, workspace_root,
|
||||
write_documentation_report,
|
||||
audit, audit_api_surface, audit_dependencies, audit_documentation, load, run, workspace_root,
|
||||
write_api_baseline, write_documentation_report,
|
||||
};
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
@@ -67,9 +67,27 @@ fn execute() -> Result<(), Box<dyn std::error::Error>> {
|
||||
audit_documentation(&root, &evidence)?;
|
||||
println!("documentation coverage: ok ({})", evidence.display());
|
||||
}
|
||||
Some("api-baseline-write") if arguments.next().is_none() => {
|
||||
write_api_baseline(&root)?;
|
||||
println!("API/SemVer baseline and report: updated");
|
||||
}
|
||||
Some("api-audit") => {
|
||||
let flag = arguments
|
||||
.next()
|
||||
.ok_or("api-audit requires --evidence FILE")?;
|
||||
let evidence = arguments
|
||||
.next()
|
||||
.ok_or("api-audit requires --evidence FILE")?;
|
||||
if flag != "--evidence" || arguments.next().is_some() {
|
||||
return Err("usage: ci-matrix api-audit --evidence FILE".into());
|
||||
}
|
||||
let evidence = absolute_or_rooted(&root, &evidence);
|
||||
audit_api_surface(&root, &evidence)?;
|
||||
println!("API/SemVer surface: ok ({})", evidence.display());
|
||||
}
|
||||
_ => {
|
||||
return Err(
|
||||
"usage: ci-matrix audit | run PROFILE --evidence FILE | dependency-audit --evidence FILE | documentation-report | documentation-audit --evidence FILE"
|
||||
"usage: ci-matrix audit | run PROFILE --evidence FILE | dependency-audit --evidence FILE | documentation-report | documentation-audit --evidence FILE | api-baseline-write | api-audit --evidence FILE"
|
||||
.into(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2921,10 +2921,12 @@ NATIVE_MESSAGE_CODEC_TYPES = {
|
||||
OPEN_ENUM_IDS = {"T:LibreMetaverse.BakeType", "T:LibreMetaverse.HoleType"}
|
||||
TRAIT_SUPERTRAITS = {
|
||||
"T:LibreMetaverse.IBakingTextureProvider": "std::any::Any + Send + Sync",
|
||||
"T:LibreMetaverse.IGridClient": "Send + Sync",
|
||||
"T:LibreMetaverse.Interfaces.IMessage": "std::any::Any",
|
||||
"T:LibreMetaverse.Appearance.ICurrentOutfitPolicy": "Send + Sync",
|
||||
"T:LibreMetaverse.RLV.IRlvActionCallbacks": "Send + Sync",
|
||||
"T:LibreMetaverse.RLV.IRlvQueryCallbacks": "Send + Sync",
|
||||
"T:LibreMetaverse.Voice.WebRTC.IVoiceLogger": "Send + Sync",
|
||||
}
|
||||
CORE_NAMESPACES = (
|
||||
"LibreMetaverse.Http",
|
||||
|
||||
@@ -1271,7 +1271,19 @@ def parameter_slug(value: str) -> str:
|
||||
def member_signature(mapper: Mapper, owner: dict, item: dict, rust_name: str) -> tuple[str, str, str, str, str]:
|
||||
if item["doc_id"] in MEMBER_SIGNATURE_OVERRIDES:
|
||||
signature, ownership = MEMBER_SIGNATURE_OVERRIDES[item["doc_id"]]
|
||||
return signature, ownership, "sync", "Result<_, crate::Error>", "method"
|
||||
error_model = (
|
||||
"none"
|
||||
if item["doc_id"] == "P:LibreMetaverse.ExpiringCache`2.Item(`0)"
|
||||
else "Result<_, crate::Error>"
|
||||
)
|
||||
asyncness = (
|
||||
"async"
|
||||
if signature.startswith("pub async fn")
|
||||
else "boxed_future"
|
||||
if "dyn std::future::Future" in signature
|
||||
else "sync"
|
||||
)
|
||||
return signature, ownership, asyncness, error_model, "method"
|
||||
generics = generic_names(item, owner)
|
||||
mapped_parameters = [map_parameter(mapper, parameter, generics) for parameter in item.get("parameters", [])]
|
||||
packet_owner = owner["doc_id"].startswith("T:LibreMetaverse.Packets.")
|
||||
|
||||
Reference in New Issue
Block a user