diff --git a/Cargo.lock b/Cargo.lock index 5675f74..3671f57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -272,6 +272,7 @@ dependencies = [ name = "libremetaverse-structured-data" version = "0.0.1" dependencies = [ + "base64", "libremetaverse-types", ] diff --git a/README.md b/README.md index 1d80213..dfbef64 100644 --- a/README.md +++ b/README.md @@ -73,5 +73,12 @@ hierarchical token-bucket throttling are native Rust as well. Cache and bucket tests use injected monotonic clocks, and concurrency invariants run without sleep-based timing. All 45 Types and all 942 mapped members now resolve to native implementations; no generated Types shims remain. +Milestone 05 now has a native, format-neutral OSD value model with structural +equality and hashing, permissive `LibreMetaverse` conversion defaults, explicit +integer/date byte order, synchronized snapshot-based arrays and maps, and +bounded parser dispatch. OSD map order is intentionally unspecified at the +public model boundary; encoders must choose and document any stable ordering +they require. Untrusted dispatch limits input bytes, nesting depth, decoded +nodes, and aggregate binary allocation before returning a value. The controlled audit aggregates every expected failure by standardized C# member ID and rejects unrelated fixture, assertion, compile, or symbol errors. diff --git a/api/RUST-MAPPING.tsv b/api/RUST-MAPPING.tsv index 11f21f8..138bbdd 100644 --- a/api/RUST-MAPPING.tsv +++ b/api/RUST-MAPPING.tsv @@ -24778,7 +24778,7 @@ M:LibreMetaverse.StructuredData.OSDArray.Clear method System.Void LibreMetaverse M:LibreMetaverse.StructuredData.OSDArray.Contains(LibreMetaverse.StructuredData.OSD) method System.Boolean LibreMetaverse.StructuredData.OSDArray.Contains(LibreMetaverse.StructuredData.OSD llsd) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::contains_with_osd pub fn contains_with_osd(&self, llsd: libremetaverse_structured_data::OSD) -> Result shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.StructuredData.OSDArray.Contains(System.String) method System.Boolean LibreMetaverse.StructuredData.OSDArray.Contains(System.String element) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::contains_with_string pub fn contains_with_string(&self, element: String) -> Result shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.StructuredData.OSDArray.Copy method LibreMetaverse.StructuredData.OSD LibreMetaverse.StructuredData.OSDArray.Copy() libremetaverse-structured-data libremetaverse_structured_data::OSDArray::copy pub fn copy(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[],System.Int32) method System.Void LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[] array, System.Int32 index) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::copy_to pub fn copy_to(&self, array: Vec, index: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[],System.Int32) method System.Void LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[] array, System.Int32 index) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::copy_to pub fn copy_to(&self, array: &mut [libremetaverse_structured_data::OSD], index: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDArray.IndexOf(LibreMetaverse.StructuredData.OSD) method System.Int32 LibreMetaverse.StructuredData.OSDArray.IndexOf(LibreMetaverse.StructuredData.OSD item) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::index_of pub fn index_of(&self, item: libremetaverse_structured_data::OSD) -> Result shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDArray.Insert(System.Int32,LibreMetaverse.StructuredData.OSD) method System.Void LibreMetaverse.StructuredData.OSDArray.Insert(System.Int32 index, LibreMetaverse.StructuredData.OSD item) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::insert pub fn insert(&self, index: i32, item: libremetaverse_structured_data::OSD) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDArray.Remove(LibreMetaverse.StructuredData.OSD) method System.Boolean LibreMetaverse.StructuredData.OSDArray.Remove(LibreMetaverse.StructuredData.OSD llsd) libremetaverse-structured-data libremetaverse_structured_data::OSDArray::remove pub fn remove(&self, llsd: libremetaverse_structured_data::OSD) -> Result shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped @@ -24843,7 +24843,7 @@ M:LibreMetaverse.StructuredData.OSDMap.Clear method System.Void LibreMetaverse.S M:LibreMetaverse.StructuredData.OSDMap.Contains(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}) method System.Boolean LibreMetaverse.StructuredData.OSDMap.Contains(System.Collections.Generic.KeyValuePair kvp) libremetaverse-structured-data libremetaverse_structured_data::OSDMap::contains pub fn contains(&self, kvp: (String, libremetaverse_structured_data::OSD)) -> Result shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDMap.ContainsKey(System.String) method System.Boolean LibreMetaverse.StructuredData.OSDMap.ContainsKey(System.String key) libremetaverse-structured-data libremetaverse_structured_data::OSDMap::contains_key pub fn contains_key(&self, key: String) -> Result shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDMap.Copy method LibreMetaverse.StructuredData.OSD LibreMetaverse.StructuredData.OSDMap.Copy() libremetaverse-structured-data libremetaverse_structured_data::OSDMap::copy pub fn copy(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}[],System.Int32) method System.Void LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair[] array, System.Int32 index) libremetaverse-structured-data libremetaverse_structured_data::OSDMap::copy_to pub fn copy_to(&self, array: Vec<(String, libremetaverse_structured_data::OSD)>, index: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}[],System.Int32) method System.Void LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair[] array, System.Int32 index) libremetaverse-structured-data libremetaverse_structured_data::OSDMap::copy_to pub fn copy_to(&self, array: &mut [(String, libremetaverse_structured_data::OSD)], index: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDMap.GetEnumerator method System.Collections.IDictionaryEnumerator LibreMetaverse.StructuredData.OSDMap.GetEnumerator() libremetaverse-structured-data libremetaverse_structured_data::OSDMap::get_enumerator pub fn get_enumerator(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.StructuredData.OSDMap.Remove(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}) method System.Boolean LibreMetaverse.StructuredData.OSDMap.Remove(System.Collections.Generic.KeyValuePair kvp) libremetaverse-structured-data libremetaverse_structured_data::OSDMap::remove_with_key_value_pair pub fn remove_with_key_value_pair(&self, kvp: (String, libremetaverse_structured_data::OSD)) -> Result shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.StructuredData.OSDMap.Remove(System.String) method System.Boolean LibreMetaverse.StructuredData.OSDMap.Remove(System.String key) libremetaverse-structured-data libremetaverse_structured_data::OSDMap::remove_with_string pub fn remove_with_string(&self, key: String) -> Result shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped diff --git a/api/SHIM-COVERAGE.md b/api/SHIM-COVERAGE.md index 4f5b791..e9888b2 100644 --- a/api/SHIM-COVERAGE.md +++ b/api/SHIM-COVERAGE.md @@ -12,7 +12,7 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand. | `LibreMetaverse.RLV` | 28 | 499 | callable failure-only shim | | `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | callable failure-only shim | | `LibreMetaverse.Rendering.Simple` | 1 | 6 | callable failure-only shim | -| `LibreMetaverse.StructuredData` | 16 | 295 | callable failure-only shim | +| `LibreMetaverse.StructuredData` | 16 | 295 | native implementation: 15 types / 255 members; remaining surface is callable failure-only shims | | `LibreMetaverse.Types` | 45 | 942 | native implementation: 45 types / 942 members; no generated shims remain | | `LibreMetaverse.Utilities` | 3 | 13 | callable failure-only shim | | `LibreMetaverse.Voice.Vivox` | 64 | 531 | callable failure-only shim | diff --git a/crates/libremetaverse-structured-data/Cargo.toml b/crates/libremetaverse-structured-data/Cargo.toml index 05387dd..5d00949 100644 --- a/crates/libremetaverse-structured-data/Cargo.toml +++ b/crates/libremetaverse-structured-data/Cargo.toml @@ -8,6 +8,7 @@ repository.workspace = true description = "OSD and LLSD shims for the MetaCrate LibreMetaverse rewrite" [dependencies] +base64 = "0.22" libremetaverse-types = { path = "../libremetaverse-types" } [lints] diff --git a/crates/libremetaverse-structured-data/src/dispatch.rs b/crates/libremetaverse-structured-data/src/dispatch.rs new file mode 100644 index 0000000..6a8b0b2 --- /dev/null +++ b/crates/libremetaverse-structured-data/src/dispatch.rs @@ -0,0 +1,194 @@ +//! Bounded wire-format dispatch for the public `OSDParser.Deserialize` overloads. + +use crate::{Error, OSD, OSDParser}; +use libremetaverse_types::compat::ReadWrite; +use std::io::Read as _; + +const PROBE_LENGTH: usize = 20; +const MAX_INPUT_BYTES: usize = OSD::DEFAULT_MAX_BINARY_BYTES; +const BINARY_HEADER: &str = ""; +const PROTOBUF_HEADER: &str = ""; +const XML_HEADERS: [&str; 3] = ["", ""]; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum WireFormat { + Binary, + Json, + Protobuf, + Xml, +} + +pub(crate) fn deserialize_bytes(data: Vec) -> Result { + if data.len() > MAX_INPUT_BYTES { + return Err(Error::Argument); + } + let format = classify_bytes(&data).ok_or(Error::Argument)?; + let value = match format { + WireFormat::Binary => OSDParser::deserialize_llsd_binary_with_bytes(data)?, + WireFormat::Protobuf => OSDParser::deserialize_llsd_protobuf_with_bytes(data)?, + WireFormat::Xml => OSDParser::deserialize_llsd_xml_with_bytes(data)?, + WireFormat::Json => OSDParser::deserialize_json_with_string( + String::from_utf8(data).map_err(|_| Error::Argument)?, + )?, + }; + validate_decoded(value) +} + +pub(crate) fn deserialize_string(data: String) -> Result { + if data.len() > MAX_INPUT_BYTES { + return Err(Error::Argument); + } + let value = match classify_string(&data) { + WireFormat::Binary => OSDParser::deserialize_llsd_binary_with_bytes(data.into_bytes())?, + WireFormat::Protobuf => OSDParser::deserialize_llsd_protobuf_with_bytes(data.into_bytes())?, + WireFormat::Xml => OSDParser::deserialize_llsd_xml_with_string(data)?, + WireFormat::Json => OSDParser::deserialize_json_with_string(data)?, + }; + validate_decoded(value) +} + +pub(crate) fn deserialize_stream(mut stream: Box) -> Result { + let mut data = Vec::new(); + (&mut *stream) + .take((MAX_INPUT_BYTES + 1) as u64) + .read_to_end(&mut data) + .map_err(|_| Error::Argument)?; + deserialize_bytes(data) +} + +fn validate_decoded(value: OSD) -> Result { + value.validate_limits( + OSD::DEFAULT_MAX_DEPTH, + OSD::DEFAULT_MAX_NODES, + OSD::DEFAULT_MAX_BINARY_BYTES, + )?; + Ok(value) +} + +fn classify_bytes(data: &[u8]) -> Option { + let probe = &data[..data.len().min(PROBE_LENGTH)]; + let ascii = String::from_utf8_lossy(probe); + let utf8 = ascii.trim_start_matches('\u{feff}').trim_start(); + if starts_with_any_ignore_ascii_case(utf8, &XML_HEADERS) { + return Some(WireFormat::Xml); + } + if starts_with_ignore_ascii_case(&ascii, PROTOBUF_HEADER) { + return Some(WireFormat::Protobuf); + } + if starts_with_ignore_ascii_case(&ascii, BINARY_HEADER) { + return Some(WireFormat::Binary); + } + if starts_with_any_ignore_ascii_case(&ascii, &XML_HEADERS) { + return Some(WireFormat::Xml); + } + let first = utf8.as_bytes().first().copied()?; + if matches!(first, b'{' | b'[' | b'"' | b'-' | b'0'..=b'9') + || utf8.starts_with("true") + || utf8.starts_with("false") + || utf8.starts_with("null") + { + Some(WireFormat::Json) + } else { + None + } +} + +fn classify_string(data: &str) -> WireFormat { + if starts_with_ignore_ascii_case(data, PROTOBUF_HEADER) { + WireFormat::Protobuf + } else if starts_with_ignore_ascii_case(data, BINARY_HEADER) { + WireFormat::Binary + } else if starts_with_any_ignore_ascii_case(data, &XML_HEADERS) { + WireFormat::Xml + } else { + WireFormat::Json + } +} + +fn starts_with_any_ignore_ascii_case(value: &str, prefixes: &[&str]) -> bool { + prefixes + .iter() + .any(|prefix| starts_with_ignore_ascii_case(value, prefix)) +} + +fn starts_with_ignore_ascii_case(value: &str, prefix: &str) -> bool { + value + .get(..prefix.len()) + .is_some_and(|candidate| candidate.eq_ignore_ascii_case(prefix)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn byte_dispatch_recognizes_headers_bom_whitespace_and_json_tokens() { + assert_eq!( + classify_bytes(b"i"), + Some(WireFormat::Binary) + ); + assert_eq!( + classify_bytes(b""), + Some(WireFormat::Protobuf) + ); + assert_eq!( + classify_bytes(b" \n"), + Some(WireFormat::Xml) + ); + assert_eq!(classify_bytes(b" [1,2]"), Some(WireFormat::Json)); + assert_eq!(classify_bytes(b"Unknown conference"), None); + } + + #[test] + fn string_dispatch_matches_reference_fallback_to_json() { + assert_eq!(classify_string("i"), WireFormat::Binary); + assert_eq!(classify_string(""), WireFormat::Xml); + assert_eq!(classify_string("plain text"), WireFormat::Json); + } + + #[test] + fn public_byte_dispatch_rejects_unrecognized_plain_text() { + assert_eq!( + deserialize_bytes(b"Unknown conference".to_vec()), + Err(Error::Argument) + ); + let cases: &[(&[u8], &str)] = &[ + ( + b"i\0\0\0\0", + "M:LibreMetaverse.StructuredData.OSDParser.DeserializeLLSDBinary(System.Byte[])", + ), + ( + b"", + "M:LibreMetaverse.StructuredData.OSDParser.DeserializeLLSDProtobuf(System.Byte[])", + ), + ( + b"", + "M:LibreMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.Byte[])", + ), + ( + b"{}", + "M:LibreMetaverse.StructuredData.OSDParser.DeserializeJson(System.String)", + ), + ]; + for (input, expected_member) in cases { + assert_eq!( + deserialize_bytes(input.to_vec()) + .expect_err("format decoder is intentionally owned by a later issue") + .csharp_member(), + Some(*expected_member) + ); + } + + let stream = Box::new(std::io::Cursor::new(b"{}".to_vec())); + assert_eq!( + deserialize_stream(stream) + .expect_err("JSON decoder is intentionally owned by issue #36") + .csharp_member(), + Some("M:LibreMetaverse.StructuredData.OSDParser.DeserializeJson(System.String)") + ); + } +} diff --git a/crates/libremetaverse-structured-data/src/generated.rs b/crates/libremetaverse-structured-data/src/generated.rs index 8825524..1d52255 100644 --- a/crates/libremetaverse-structured-data/src/generated.rs +++ b/crates/libremetaverse-structured-data/src/generated.rs @@ -6,1233 +6,232 @@ #![allow(non_snake_case)] /// C# type: `T:LibreMetaverse.StructuredData.OSD`. -#[non_exhaustive] -pub enum OSD { - Undefined, - Boolean(bool), - Integer(i32), - Real(f64), - String(String), - UUID(libremetaverse_types::UUID), - Date(std::time::SystemTime), - Uri(libremetaverse_types::compat::Uri), - Binary(Vec), - Array(Vec), - Map(std::collections::HashMap), - LlsdXml(String), -} -impl OSD { - /// C# member: `M:LibreMetaverse.StructuredData.OSD.#ctor`. - pub fn new() -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.#ctor") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsBoolean") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsColor4`. - pub fn as_color4(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsColor4") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsDate`. - pub fn as_date(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsDate") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsInteger`. - pub fn as_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsQuaternion`. - pub fn as_quaternion(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsQuaternion") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsReal`. - pub fn as_real(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsReal") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsUInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsUUID`. - pub fn as_uuid(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsUUID") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsUri`. - pub fn as_uri(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsUri") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector2`. - pub fn as_vector2(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsVector2") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector3`. - pub fn as_vector3(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsVector3") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector3d`. - pub fn as_vector3d(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsVector3d") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector4`. - pub fn as_vector4(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.AsVector4") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSD.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.DeserializeMembers(System.Object@,LibreMetaverse.StructuredData.OSDMap)`. - pub fn deserialize_members( - obj: &mut libremetaverse_types::compat::Object, - serialized: libremetaverse_structured_data::OSDMap, - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.DeserializeMembers(System.Object@,LibreMetaverse.StructuredData.OSDMap)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromBinary(System.Byte[])`. - pub fn from_binary( - value: Vec, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromBinary(System.Byte[])", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromBoolean(System.Boolean)`. - pub fn from_boolean(value: bool) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromBoolean(System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromColor4(LibreMetaverse.Color4)`. - pub fn from_color4( - value: libremetaverse_types::Color4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromColor4(LibreMetaverse.Color4)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromDate(System.DateTime)`. - pub fn from_date( - value: std::time::SystemTime, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromDate(System.DateTime)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Byte)`. - pub fn from_integer_with_byte( - value: u8, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Byte)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Int16)`. - pub fn from_integer_with_int16( - value: i16, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Int16)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Int32)`. - pub fn from_integer_with_int32( - value: i32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.SByte)`. - pub fn from_integer_with_s_byte( - value: i8, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromInteger(System.SByte)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.UInt16)`. - pub fn from_integer_with_u_int16( - value: u16, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromInteger(System.UInt16)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.UInt32)`. - pub fn from_integer_with_u_int32( - value: u32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromInteger(System.UInt32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromLong(System.Int64)`. - pub fn from_long(value: i64) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromLong(System.Int64)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromObject(System.Object)`. - pub fn from_object( - value: libremetaverse_types::compat::Object, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromObject(System.Object)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromQuaternion(LibreMetaverse.Quaternion)`. - pub fn from_quaternion( - value: libremetaverse_types::Quaternion, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromQuaternion(LibreMetaverse.Quaternion)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromReal(System.Double)`. - pub fn from_real_with_double( - value: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromReal(System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromReal(System.Single)`. - pub fn from_real_with_single( - value: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromReal(System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromString(System.String)`. - pub fn from_string(value: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromString(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromUInteger(System.UInt32)`. - pub fn from_u_integer(value: u32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromUInteger(System.UInt32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromULong(System.UInt64)`. - pub fn from_u_long(value: u64) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromULong(System.UInt64)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromUUID(LibreMetaverse.UUID)`. - pub fn from_uuid( - value: libremetaverse_types::UUID, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromUUID(LibreMetaverse.UUID)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromUri(System.Uri)`. - pub fn from_uri( - value: libremetaverse_types::compat::Uri, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromUri(System.Uri)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector2(LibreMetaverse.Vector2)`. - pub fn from_vector2( - value: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromVector2(LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector3(LibreMetaverse.Vector3)`. - pub fn from_vector3( - value: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromVector3(LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector3d(LibreMetaverse.Vector3d)`. - pub fn from_vector3d( - value: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromVector3d(LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector4(LibreMetaverse.Vector4)`. - pub fn from_vector4( - value: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.FromVector4(LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.SerializeMembers(System.Object)`. - pub fn serialize_members( - obj: libremetaverse_types::compat::Object, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.SerializeMembers(System.Object)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.ToObject(System.Type,LibreMetaverse.StructuredData.OSD)`. - pub fn to_object( - type_: libremetaverse_types::compat::TypeId, - value: libremetaverse_structured_data::OSD, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSD.ToObject(System.Type,LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.StructuredData.OSD.ToString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Color4)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_color4( - value: libremetaverse_types::Color4, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Color4)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Quaternion)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_quaternion( - value: libremetaverse_types::Quaternion, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Quaternion)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Color4`. - pub fn from_with_osd( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::Color4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Color4" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Quaternion`. - pub fn from_with_osd_b8ef4612( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::Quaternion { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Quaternion" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.UUID`. - pub fn from_with_osd_eba15316( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::UUID { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.UUID" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector2`. - pub fn from_with_osd_e9aee905( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector2" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector3`. - pub fn from_with_osd_93c123bc( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector3" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector3d`. - pub fn from_with_osd_d799abcc( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector3d" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector4`. - pub fn from_with_osd_866cd1d2( - value: libremetaverse_structured_data::OSD, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector4" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Boolean`. - pub fn from_with_osd_f50c5016(value: libremetaverse_structured_data::OSD) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Boolean" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Byte[]`. - pub fn from_with_osd_ffa78bdc(value: libremetaverse_structured_data::OSD) -> Vec { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Byte[]" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.DateTime`. - pub fn from_with_osd_37aede2f( - value: libremetaverse_structured_data::OSD, - ) -> std::time::SystemTime { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.DateTime" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Double`. - pub fn from_with_osd_1b5df47b(value: libremetaverse_structured_data::OSD) -> f64 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Double" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Int32`. - pub fn from_with_osd_0d6b9c45(value: libremetaverse_structured_data::OSD) -> i32 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Int32" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Int64`. - pub fn from_with_osd_75ba279e(value: libremetaverse_structured_data::OSD) -> i64 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Int64" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Single`. - pub fn from_with_osd_232c9960(value: libremetaverse_structured_data::OSD) -> f32 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Single" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.String`. - pub fn from_with_osd_853f4d5d(value: libremetaverse_structured_data::OSD) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.String" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.UInt32`. - pub fn from_with_osd_6a01d439(value: libremetaverse_structured_data::OSD) -> u32 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.UInt32" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.UInt64`. - pub fn from_with_osd_1ae3c138(value: libremetaverse_structured_data::OSD) -> u64 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.UInt64" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Uri`. - pub fn from_with_osd_8dbb79ec( - value: libremetaverse_structured_data::OSD, - ) -> Option { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Uri" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.UUID)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_uuid( - value: libremetaverse_types::UUID, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.UUID)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector2)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_vector2( - value: libremetaverse_types::Vector2, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector2)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector3)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_vector3( - value: libremetaverse_types::Vector3, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector3)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector3d)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_vector3d( - value: libremetaverse_types::Vector3d, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector3d)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector4)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_vector4( - value: libremetaverse_types::Vector4, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector4)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Boolean)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_boolean(value: bool) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Boolean)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Byte)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_byte(value: u8) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Byte)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Byte[])~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_bytes(value: Vec) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Byte[])~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.DateTime)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_date_time( - value: std::time::SystemTime, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.DateTime)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Double)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_double(value: f64) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Double)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int16)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_int16(value: i16) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int16)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int32)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_int32(value: i32) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int32)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int64)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_int64(value: i64) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int64)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.SByte)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_s_byte(value: i8) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.SByte)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Single)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_single(value: f32) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Single)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.String)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_string(value: String) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.String)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt16)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_u_int16(value: u16) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt16)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt32)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_u_int32(value: u32) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt32)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt64)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_u_int64(value: u64) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt64)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Uri)~LibreMetaverse.StructuredData.OSD`. - pub fn from_with_uri( - value: libremetaverse_types::compat::Uri, - ) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Uri)~LibreMetaverse.StructuredData.OSD" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSD.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSD.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSD.#ctor`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsColor4`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsDate`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsQuaternion`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsReal`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsUUID`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsUri`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector2`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector3`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector3d`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.AsVector4`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.DeserializeMembers(System.Object@,LibreMetaverse.StructuredData.OSDMap)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromBinary(System.Byte[])`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromBoolean(System.Boolean)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromColor4(LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromDate(System.DateTime)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Byte)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Int16)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.SByte)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.UInt16)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromInteger(System.UInt32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromLong(System.Int64)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromObject(System.Object)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromQuaternion(LibreMetaverse.Quaternion)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromReal(System.Double)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromReal(System.Single)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromString(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromUInteger(System.UInt32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromULong(System.UInt64)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromUUID(LibreMetaverse.UUID)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromUri(System.Uri)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector2(LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector3(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector3d(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.FromVector4(LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.SerializeMembers(System.Object)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.ToObject(System.Type,LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.ToString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Color4)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Quaternion)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Color4`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Quaternion`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.UUID`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector2`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector3`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector3d`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~LibreMetaverse.Vector4`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Boolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Byte[]`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.DateTime`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Double`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Int32`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Int64`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Single`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.String`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.UInt32`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.UInt64`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.StructuredData.OSD)~System.Uri`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.UUID)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector2)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector3)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector3d)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(LibreMetaverse.Vector4)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Boolean)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Byte)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Byte[])~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.DateTime)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Double)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int16)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int32)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Int64)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.SByte)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Single)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.String)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt16)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt32)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.UInt64)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `M:LibreMetaverse.StructuredData.OSD.op_Implicit(System.Uri)~LibreMetaverse.StructuredData.OSD`. +/// C# member: `P:LibreMetaverse.StructuredData.OSD.Type`. +pub use crate::model::OSD; /// C# type: `T:LibreMetaverse.StructuredData.OSDArray`. -pub struct OSDArray { - values: Vec, -} -impl OSDArray { - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.#ctor`. - pub fn new_with_constructor() -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.#ctor") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.#ctor(System.Collections.Generic.List{LibreMetaverse.StructuredData.OSD})`. - pub fn new_with_list( - value: Vec, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.#ctor(System.Collections.Generic.List{LibreMetaverse.StructuredData.OSD})", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.#ctor(System.Int32)`. - pub fn new_with_int32(capacity: i32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.#ctor(System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Add(LibreMetaverse.StructuredData.OSD)`. - pub fn add(&self, llsd: libremetaverse_structured_data::OSD) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.Add(LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsBoolean") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsColor4`. - pub fn as_color4(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsColor4") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsQuaternion`. - pub fn as_quaternion(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.AsQuaternion", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsUInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector2`. - pub fn as_vector2(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsVector2") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector3`. - pub fn as_vector3(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsVector3") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector3d`. - pub fn as_vector3d(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsVector3d") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector4`. - pub fn as_vector4(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.AsVector4") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Clear`. - pub fn clear(&self) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.Clear") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Contains(LibreMetaverse.StructuredData.OSD)`. - pub fn contains_with_osd( - &self, - llsd: libremetaverse_structured_data::OSD, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.Contains(LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Contains(System.String)`. - pub fn contains_with_string(&self, element: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.Contains(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDArray.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[],System.Int32)`. - pub fn copy_to( - &self, - array: Vec, - index: i32, - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.IndexOf(LibreMetaverse.StructuredData.OSD)`. - pub fn index_of(&self, item: libremetaverse_structured_data::OSD) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.IndexOf(LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Insert(System.Int32,LibreMetaverse.StructuredData.OSD)`. - pub fn insert( - &self, - index: i32, - item: libremetaverse_structured_data::OSD, - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.Insert(System.Int32,LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Remove(LibreMetaverse.StructuredData.OSD)`. - pub fn remove(&self, llsd: libremetaverse_structured_data::OSD) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.Remove(LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.RemoveAt(System.Int32)`. - pub fn remove_at(&self, index: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.RemoveAt(System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.ToArrayList`. - pub fn to_array_list(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDArray.ToArrayList", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDArray.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDArray.ToString" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDArray.Count`. - pub fn count(&self) -> i32 { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDArray.Count") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDArray.IsReadOnly`. - pub fn is_read_only(&self) -> bool { - libremetaverse_types::unimplemented_api!( - "P:LibreMetaverse.StructuredData.OSDArray.IsReadOnly" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDArray.Item(System.Int32)`. - pub fn item(&self, index: i32) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "P:LibreMetaverse.StructuredData.OSDArray.Item(System.Int32)" - ) - } - /// Setter for C# member: `P:LibreMetaverse.StructuredData.OSDArray.Item(System.Int32)`. - pub fn set_item(&mut self, index: i32, value: libremetaverse_structured_data::OSD) { - libremetaverse_types::unimplemented_api!( - "P:LibreMetaverse.StructuredData.OSDArray.Item(System.Int32)" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDArray.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDArray.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.#ctor`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.#ctor(System.Collections.Generic.List{LibreMetaverse.StructuredData.OSD})`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.#ctor(System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Add(LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsColor4`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsQuaternion`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector2`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector3`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector3d`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.AsVector4`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Clear`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Contains(LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Contains(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[],System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.IndexOf(LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Insert(System.Int32,LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.Remove(LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.RemoveAt(System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.ToArrayList`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDArray.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDArray.Count`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDArray.IsReadOnly`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDArray.Item(System.Int32)`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDArray.Type`. +pub use crate::model::OSDArray; /// C# type: `T:LibreMetaverse.StructuredData.OSDBinary`. -pub struct OSDBinary { - value: Vec, -} -impl OSDBinary { - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.Byte[])`. - pub fn new_with_bytes(value: Vec) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.Byte[])", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.Int64)`. - pub fn new_with_int64(value: i64) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.Int64)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.UInt32)`. - pub fn new_with_u_int32(value: u32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.UInt32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.UInt64)`. - pub fn new_with_u_int64(value: u64) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.UInt64)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBinary.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBinary.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBinary.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBinary.AsUInteger", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBinary.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBinary.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDBinary.ToString" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDBinary.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDBinary.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.Byte[])`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.Int64)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.UInt32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.#ctor(System.UInt64)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBinary.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDBinary.Type`. +pub use crate::model::OSDBinary; /// C# type: `T:LibreMetaverse.StructuredData.OSDBoolean`. -pub struct OSDBoolean { - value: bool, -} -impl OSDBoolean { - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.#ctor(System.Boolean)`. - pub fn new(value: bool) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBoolean.#ctor(System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBoolean.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBoolean.AsBoolean", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsInteger`. - pub fn as_integer(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDBoolean.AsInteger", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsReal`. - pub fn as_real(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBoolean.AsReal") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBoolean.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDBoolean.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDBoolean.ToString" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDBoolean.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDBoolean.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.#ctor(System.Boolean)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsReal`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDBoolean.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDBoolean.Type`. +pub use crate::model::OSDBoolean; /// C# type: `T:LibreMetaverse.StructuredData.OSDDate`. -pub struct OSDDate { - value: std::time::SystemTime, -} -impl OSDDate { - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.#ctor(System.DateTime)`. - pub fn new(dt: std::time::SystemTime) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDDate.#ctor(System.DateTime)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsDate`. - pub fn as_date(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsDate") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsInteger`. - pub fn as_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsUInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDDate.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDDate.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.StructuredData.OSDDate.ToString") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDDate.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDDate.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.#ctor(System.DateTime)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsDate`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDDate.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDDate.Type`. +pub use crate::model::OSDDate; /// C# type: `T:LibreMetaverse.StructuredData.OSDException`. -pub struct OSDException { - message: String, -} -impl OSDException { - /// C# member: `M:LibreMetaverse.StructuredData.OSDException.#ctor`. - pub fn new_with_constructor() -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDException.#ctor") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDException.#ctor(System.String)`. - pub fn new_with_string(message: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDException.#ctor(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDException.#ctor(System.String,System.Exception)`. - pub fn new_with_string_exception( - message: String, - inner_exception: libremetaverse_types::compat::ExternalError, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDException.#ctor(System.String,System.Exception)", - ) - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDException.#ctor`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDException.#ctor(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDException.#ctor(System.String,System.Exception)`. +pub use crate::model::OSDException; /// C# type: `T:LibreMetaverse.StructuredData.OSDFormat`. -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -#[repr(i32)] -pub enum OSDFormat { - /// C# member: `F:LibreMetaverse.StructuredData.OSDFormat.Binary`. - Binary = 2, - /// C# member: `F:LibreMetaverse.StructuredData.OSDFormat.Json`. - Json = 1, - /// C# member: `F:LibreMetaverse.StructuredData.OSDFormat.Xml`. - Xml = 0, -} +/// C# member: `F:LibreMetaverse.StructuredData.OSDFormat.Binary`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDFormat.Json`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDFormat.Xml`. +pub use crate::model::OSDFormat; /// C# type: `T:LibreMetaverse.StructuredData.OSDInteger`. -pub struct OSDInteger { - value: i32, -} -impl OSDInteger { - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.#ctor(System.Int32)`. - pub fn new(value: i32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDInteger.#ctor(System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDInteger.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDInteger.AsBoolean", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsInteger`. - pub fn as_integer(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDInteger.AsInteger", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDInteger.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsReal`. - pub fn as_real(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDInteger.AsReal") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDInteger.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDInteger.AsUInteger", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDInteger.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDInteger.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDInteger.ToString" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDInteger.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDInteger.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.#ctor(System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsReal`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDInteger.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDInteger.Type`. +pub use crate::model::OSDInteger; /// C# type: `T:LibreMetaverse.StructuredData.OSDLlsdXml`. -pub struct OSDLlsdXml { - /// C# member: `F:LibreMetaverse.StructuredData.OSDLlsdXml.value`. - pub value: String, -} -impl OSDLlsdXml { - /// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.#ctor(System.String)`. - pub fn new(value: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDLlsdXml.#ctor(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDLlsdXml.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDLlsdXml.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDLlsdXml.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDLlsdXml.ToString" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDLlsdXml.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDLlsdXml.Type") - } -} +/// C# member: `F:LibreMetaverse.StructuredData.OSDLlsdXml.value`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.#ctor(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDLlsdXml.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDLlsdXml.Type`. +pub use crate::model::OSDLlsdXml; /// C# type: `T:LibreMetaverse.StructuredData.OSDMap`. -pub struct OSDMap { - values: std::collections::HashMap, -} -impl OSDMap { - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.#ctor`. - pub fn new_with_constructor() -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDMap.#ctor") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.#ctor(System.Collections.Generic.Dictionary{System.String,LibreMetaverse.StructuredData.OSD})`. - pub fn new_with_dictionary( - value: std::collections::HashMap, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.#ctor(System.Collections.Generic.Dictionary{System.String,LibreMetaverse.StructuredData.OSD})", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.#ctor(System.Int32)`. - pub fn new_with_int32(capacity: i32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.#ctor(System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Add(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})`. - pub fn add_with_key_value_pair( - &self, - kvp: (String, libremetaverse_structured_data::OSD), - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.Add(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Add(System.String,LibreMetaverse.StructuredData.OSD)`. - pub fn add_with_string_osd( - &self, - key: String, - llsd: libremetaverse_structured_data::OSD, - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.Add(System.String,LibreMetaverse.StructuredData.OSD)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDMap.AsBoolean") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Clear`. - pub fn clear(&self) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDMap.Clear") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Contains(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})`. - pub fn contains( - &self, - kvp: (String, libremetaverse_structured_data::OSD), - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.Contains(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.ContainsKey(System.String)`. - pub fn contains_key(&self, key: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.ContainsKey(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDMap.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}[],System.Int32)`. - pub fn copy_to( - &self, - array: Vec<(String, libremetaverse_structured_data::OSD)>, - index: i32, - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.GetEnumerator`. - pub fn get_enumerator( - &self, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.GetEnumerator", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Remove(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})`. - pub fn remove_with_key_value_pair( - &self, - kvp: (String, libremetaverse_structured_data::OSD), - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.Remove(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Remove(System.String)`. - pub fn remove_with_string(&self, key: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDMap.Remove(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.ToHashtable`. - pub fn to_hashtable(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDMap.ToHashtable") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.StructuredData.OSDMap.ToString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDMap.TryGetValue(System.String,LibreMetaverse.StructuredData.OSD@)`. - pub fn try_get_value( - &self, - key: String, - llsd: &mut libremetaverse_structured_data::OSD, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDMap.TryGetValue(System.String,LibreMetaverse.StructuredData.OSD@)" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Count`. - pub fn count(&self) -> i32 { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDMap.Count") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDMap.IsReadOnly`. - pub fn is_read_only(&self) -> bool { - libremetaverse_types::unimplemented_api!( - "P:LibreMetaverse.StructuredData.OSDMap.IsReadOnly" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Item(System.String)`. - pub fn item(&self, key: String) -> libremetaverse_structured_data::OSD { - libremetaverse_types::unimplemented_api!( - "P:LibreMetaverse.StructuredData.OSDMap.Item(System.String)" - ) - } - /// Setter for C# member: `P:LibreMetaverse.StructuredData.OSDMap.Item(System.String)`. - pub fn set_item(&mut self, key: String, value: libremetaverse_structured_data::OSD) { - libremetaverse_types::unimplemented_api!( - "P:LibreMetaverse.StructuredData.OSDMap.Item(System.String)" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Keys`. - pub fn keys(&self) -> Vec { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDMap.Keys") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDMap.Type") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Values`. - pub fn values(&self) -> Vec { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDMap.Values") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.#ctor`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.#ctor(System.Collections.Generic.Dictionary{System.String,LibreMetaverse.StructuredData.OSD})`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.#ctor(System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Add(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Add(System.String,LibreMetaverse.StructuredData.OSD)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Clear`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Contains(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.ContainsKey(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}[],System.Int32)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.GetEnumerator`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Remove(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD})`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.Remove(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.ToHashtable`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.ToString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDMap.TryGetValue(System.String,LibreMetaverse.StructuredData.OSD@)`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Count`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDMap.IsReadOnly`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Item(System.String)`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Keys`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Type`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDMap.Values`. +pub use crate::model::OSDMap; /// C# type: `T:LibreMetaverse.StructuredData.OSDParser`. pub struct OSDParser; @@ -1260,25 +259,19 @@ impl OSDParser { pub fn deserialize_with_bytes( data: Vec, ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.Byte[])", - ) + crate::dispatch::deserialize_bytes(data) } /// C# member: `M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.IO.Stream)`. pub fn deserialize_with_stream( stream: Box, ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.IO.Stream)", - ) + crate::dispatch::deserialize_stream(stream) } /// C# member: `M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.String)`. pub fn deserialize_with_string( data: String, ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.String)", - ) + crate::dispatch::deserialize_string(data) } /// C# member: `M:LibreMetaverse.StructuredData.OSDParser.DeserializeJson(System.IO.Stream)`. pub fn deserialize_json_with_stream( @@ -1591,239 +584,70 @@ impl OSDParser { } /// C# type: `T:LibreMetaverse.StructuredData.OSDReal`. -pub struct OSDReal { - value: f64, -} -impl OSDReal { - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.#ctor(System.Double)`. - pub fn new(value: f64) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDReal.#ctor(System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsBoolean") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsInteger`. - pub fn as_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsReal`. - pub fn as_real(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsReal") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsUInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDReal.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDReal.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.StructuredData.OSDReal.ToString") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDReal.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDReal.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.#ctor(System.Double)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsReal`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDReal.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDReal.Type`. +pub use crate::model::OSDReal; /// C# type: `T:LibreMetaverse.StructuredData.OSDString`. -pub struct OSDString { - value: String, -} -impl OSDString { - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.#ctor(System.String)`. - pub fn new(value: String) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDString.#ctor(System.String)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsBoolean") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsDate`. - pub fn as_date(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsDate") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsInteger`. - pub fn as_integer(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsInteger") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsLong`. - pub fn as_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsLong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsReal`. - pub fn as_real(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsReal") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsUInteger`. - pub fn as_u_integer(&self) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDString.AsUInteger", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsULong`. - pub fn as_u_long(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsULong") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsUUID`. - pub fn as_uuid(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsUUID") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsUri`. - pub fn as_uri(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.AsUri") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDString.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDString.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.StructuredData.OSDString.ToString" - ) - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDString.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDString.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.#ctor(System.String)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsDate`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsLong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsReal`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsUInteger`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsULong`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsUUID`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.AsUri`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDString.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDString.Type`. +pub use crate::model::OSDString; /// C# type: `T:LibreMetaverse.StructuredData.OSDType`. -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -#[repr(u8)] -pub enum OSDType { - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Array`. - Array = 10, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Binary`. - Binary = 8, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Boolean`. - Boolean = 1, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Date`. - Date = 6, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Integer`. - Integer = 2, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.LlsdXml`. - LlsdXml = 11, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Map`. - Map = 9, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Real`. - Real = 3, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.String`. - String = 4, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.URI`. - URI = 7, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.UUID`. - UUID = 5, - /// C# member: `F:LibreMetaverse.StructuredData.OSDType.Unknown`. - Unknown = 0, -} +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Array`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Binary`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Boolean`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Date`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Integer`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.LlsdXml`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Map`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Real`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.String`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.URI`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.UUID`. +/// C# member: `F:LibreMetaverse.StructuredData.OSDType.Unknown`. +pub use crate::model::OSDType; /// C# type: `T:LibreMetaverse.StructuredData.OSDUUID`. -pub struct OSDUUID { - value: libremetaverse_types::UUID, -} -impl OSDUUID { - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.#ctor(LibreMetaverse.UUID)`. - pub fn new(value: libremetaverse_types::UUID) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDUUID.#ctor(LibreMetaverse.UUID)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUUID.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsBoolean`. - pub fn as_boolean(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUUID.AsBoolean") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUUID.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsUUID`. - pub fn as_uuid(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUUID.AsUUID") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUUID.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.StructuredData.OSDUUID.ToString") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDUUID.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDUUID.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.#ctor(LibreMetaverse.UUID)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsBoolean`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.AsUUID`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUUID.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDUUID.Type`. +pub use crate::model::OSDUUID; /// C# type: `T:LibreMetaverse.StructuredData.OSDUri`. -pub struct OSDUri { - value: libremetaverse_types::compat::Uri, -} -impl OSDUri { - /// C# member: `M:LibreMetaverse.StructuredData.OSDUri.#ctor(System.Uri)`. - pub fn new(uri: libremetaverse_types::compat::Uri) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.StructuredData.OSDUri.#ctor(System.Uri)", - ) - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUri.AsBinary`. - pub fn as_binary(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUri.AsBinary") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUri.AsString`. - pub fn as_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUri.AsString") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUri.AsUri`. - pub fn as_uri(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUri.AsUri") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUri.Copy`. - pub fn copy(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.StructuredData.OSDUri.Copy") - } - /// C# member: `M:LibreMetaverse.StructuredData.OSDUri.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.StructuredData.OSDUri.ToString") - } - /// C# member: `P:LibreMetaverse.StructuredData.OSDUri.Type`. - pub fn type_(&self) -> libremetaverse_structured_data::OSDType { - libremetaverse_types::unimplemented_api!("P:LibreMetaverse.StructuredData.OSDUri.Type") - } -} +/// C# member: `M:LibreMetaverse.StructuredData.OSDUri.#ctor(System.Uri)`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUri.AsBinary`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUri.AsString`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUri.AsUri`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUri.Copy`. +/// C# member: `M:LibreMetaverse.StructuredData.OSDUri.ToString`. +/// C# member: `P:LibreMetaverse.StructuredData.OSDUri.Type`. +pub use crate::model::OSDUri; diff --git a/crates/libremetaverse-structured-data/src/lib.rs b/crates/libremetaverse-structured-data/src/lib.rs index 3e094f6..2a975f2 100644 --- a/crates/libremetaverse-structured-data/src/lib.rs +++ b/crates/libremetaverse-structured-data/src/lib.rs @@ -2,7 +2,9 @@ extern crate self as libremetaverse_structured_data; +mod dispatch; mod generated; +mod model; pub mod xml { /// Project-owned XML element boundary; external XML APIs are not copied. diff --git a/crates/libremetaverse-structured-data/src/model.rs b/crates/libremetaverse-structured-data/src/model.rs new file mode 100644 index 0000000..bbb8cae --- /dev/null +++ b/crates/libremetaverse-structured-data/src/model.rs @@ -0,0 +1,1855 @@ +//! Native LLSD/OSD value model. +//! +//! The model is deliberately independent of every wire-format implementation. +//! Maps have no observable ordering contract; serializers that require stable +//! output must impose their own ordering. Collection access returns owned +//! snapshots, matching the value-oriented Rust boundary while preventing locks +//! or borrows from escaping a call. + +#![allow(clippy::cast_possible_truncation)] +#![allow(clippy::cast_possible_wrap)] // C# unchecked numeric conversions are reference behavior. +#![allow(clippy::cast_precision_loss)] // C# converts integral bounds through Double for these APIs. +#![allow(clippy::cast_sign_loss)] +#![allow(clippy::format_collect)] // Hex conversion is small and mirrors the reference allocation. +#![allow(clippy::inherent_to_string)] +#![allow(clippy::match_same_arms)] // Unsupported mapped object variants intentionally become undefined. +#![allow(clippy::missing_errors_doc)] +#![allow(clippy::missing_panics_doc)] // Infallible mapped operators and indexers have fixed signatures. +#![allow(clippy::must_use_candidate)] +#![allow(clippy::needless_pass_by_value)] +#![allow(clippy::should_implement_trait)] + +use base64::Engine as _; +use libremetaverse_types::compat::{ + ArrayList, ExternalError, Hashtable, IDictionaryEnumerator, Object, TypeId, Uri, +}; +use libremetaverse_types::{Color4, Error, Quaternion, UUID, Vector2, Vector3, Vector3d, Vector4}; +use std::collections::HashMap; +use std::fmt::Write as _; +use std::hash::{Hash, Hasher}; +use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +#[repr(u8)] +pub enum OSDType { + Unknown = 0, + Boolean = 1, + Integer = 2, + Real = 3, + String = 4, + UUID = 5, + Date = 6, + URI = 7, + Binary = 8, + Map = 9, + Array = 10, + LlsdXml = 11, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +#[repr(i32)] +pub enum OSDFormat { + Xml = 0, + Json = 1, + Binary = 2, +} + +/// A format-neutral LLSD value. +/// +/// Equality and hashing are structural. Real values compare by their IEEE-754 +/// bit pattern so that hashing remains valid for NaNs and signed zero. Map +/// hashing sorts keys first, because [`HashMap`] iteration order is unspecified. +/// +/// Typed accessors follow `LibreMetaverse`'s permissive conversion contract: +/// unsupported conversions return the type's default (`false`, zero, an empty +/// string or byte vector, the nil UUID, the Unix epoch, or no URI). Integer and +/// real conversions retain the reference's unchecked wrapping, clamping, and +/// round-to-even behavior. Binary integers use network byte order; date binary +/// values use the reference's little-endian floating-point Unix timestamp. +/// Owned variants make cloning structural and keep all borrowing local to the +/// call, so no parser or serializer implementation controls this representation. +#[non_exhaustive] +#[derive(Clone, Debug, Default)] +pub enum OSD { + #[default] + Undefined, + Boolean(bool), + Integer(i32), + Real(f64), + String(String), + UUID(UUID), + Date(SystemTime), + Uri(Uri), + Binary(Vec), + Array(Vec), + Map(HashMap), + LlsdXml(String), +} + +impl PartialEq for OSD { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Undefined, Self::Undefined) => true, + (Self::Boolean(left), Self::Boolean(right)) => left == right, + (Self::Integer(left), Self::Integer(right)) => left == right, + (Self::Real(left), Self::Real(right)) => left.to_bits() == right.to_bits(), + (Self::String(left), Self::String(right)) + | (Self::LlsdXml(left), Self::LlsdXml(right)) => left == right, + (Self::UUID(left), Self::UUID(right)) => left == right, + (Self::Date(left), Self::Date(right)) => left == right, + (Self::Uri(left), Self::Uri(right)) => left == right, + (Self::Binary(left), Self::Binary(right)) => left == right, + (Self::Array(left), Self::Array(right)) => left == right, + (Self::Map(left), Self::Map(right)) => left == right, + _ => false, + } + } +} + +impl Eq for OSD {} + +impl Hash for OSD { + fn hash(&self, state: &mut H) { + std::mem::discriminant(self).hash(state); + match self { + Self::Undefined => {} + Self::Boolean(value) => value.hash(state), + Self::Integer(value) => value.hash(state), + Self::Real(value) => value.to_bits().hash(state), + Self::String(value) | Self::LlsdXml(value) => value.hash(state), + Self::UUID(value) => value.hash(state), + Self::Date(value) => value.hash(state), + Self::Uri(value) => value.hash(state), + Self::Binary(value) => value.hash(state), + Self::Array(value) => value.hash(state), + Self::Map(value) => { + let mut entries: Vec<_> = value.iter().collect(); + entries.sort_unstable_by_key(|(key, _)| *key); + entries.hash(state); + } + } + } +} + +impl OSD { + pub const DEFAULT_MAX_DEPTH: usize = 64; + pub const DEFAULT_MAX_NODES: usize = 1_000_000; + pub const DEFAULT_MAX_BINARY_BYTES: usize = 64 * 1024 * 1024; + + pub const fn new() -> Result { + Ok(Self::Undefined) + } + + /// Checks recursively allocated data before accepting a value from an + /// untrusted parser boundary. Format parsers call this after decoding. + pub fn validate_limits( + &self, + max_depth: usize, + max_nodes: usize, + max_binary_bytes: usize, + ) -> Result<(), Error> { + let mut nodes = 0_usize; + let mut binary_bytes = 0_usize; + let mut stack = vec![(self, 0_usize)]; + while let Some((value, depth)) = stack.pop() { + if depth > max_depth { + return Err(Error::Argument); + } + nodes = nodes.checked_add(1).ok_or(Error::Argument)?; + if nodes > max_nodes { + return Err(Error::Argument); + } + match value { + Self::Binary(bytes) => { + binary_bytes = binary_bytes + .checked_add(bytes.len()) + .ok_or(Error::Argument)?; + if binary_bytes > max_binary_bytes { + return Err(Error::Argument); + } + } + Self::Array(values) => { + stack.extend(values.iter().map(|value| (value, depth + 1))); + } + Self::Map(values) => { + stack.extend(values.values().map(|value| (value, depth + 1))); + } + _ => {} + } + } + Ok(()) + } + + pub fn as_binary(&self) -> Result, Error> { + Ok(match self { + Self::Boolean(value) => vec![if *value { b'1' } else { b'0' }], + Self::Integer(value) => value.to_be_bytes().to_vec(), + Self::Real(value) => value.to_be_bytes().to_vec(), + Self::String(value) | Self::LlsdXml(value) => value.as_bytes().to_vec(), + Self::UUID(value) => value.get_bytes()?, + Self::Date(value) => unix_seconds_f64(*value).to_le_bytes().to_vec(), + Self::Uri(value) => value.0.as_bytes().to_vec(), + Self::Binary(value) => value.clone(), + Self::Array(values) => values + .iter() + .map(|value| value.as_integer().map(|integer| integer as u8)) + .collect::, _>>()?, + _ => Vec::new(), + }) + } + + pub fn as_boolean(&self) -> Result { + Ok(match self { + Self::Boolean(value) => *value, + Self::Integer(value) => *value != 0, + Self::Real(value) => !value.is_nan() && *value != 0.0, + Self::String(value) => string_as_boolean(value), + Self::UUID(value) => *value != UUID::zero(), + Self::Array(value) => !value.is_empty(), + Self::Map(value) => !value.is_empty(), + _ => false, + }) + } + + pub fn as_integer(&self) -> Result { + Ok(match self { + Self::Boolean(value) => i32::from(*value), + Self::Integer(value) => *value, + Self::Real(value) => real_to_i32(*value), + Self::String(value) => string_to_f64(value).map_or(0, floor_to_i32), + Self::Date(value) => unix_seconds_u32(*value) as i32, + _ => 0, + }) + } + + pub fn as_u_integer(&self) -> Result { + Ok(match self { + Self::Integer(value) => *value as u32, + Self::Real(value) => real_to_u32(*value), + Self::String(value) => string_to_f64(value).map_or(0, floor_to_u32), + Self::Date(value) => unix_seconds_u32(*value), + Self::Binary(value) => read_u32(value)?, + Self::Array(value) => read_u32(&Self::Array(value.clone()).as_binary()?)?, + _ => self.as_integer()? as u32, + }) + } + + pub fn as_long(&self) -> Result { + Ok(match self { + Self::Integer(value) => i64::from(*value), + Self::Real(value) => real_to_i64(*value), + Self::String(value) => string_to_f64(value).map_or(0, floor_to_i64), + Self::Date(value) => i64::from(unix_seconds_u32(*value)), + Self::Binary(value) => read_i64(value)?, + Self::Array(value) => read_i64(&Self::Array(value.clone()).as_binary()?)?, + _ => 0, + }) + } + + pub fn as_u_long(&self) -> Result { + Ok(match self { + Self::Integer(value) => *value as u64, + Self::Real(value) => real_to_u64(*value), + Self::String(value) => string_to_f64(value).map_or(0, floor_to_u64), + Self::Date(value) => u64::from(unix_seconds_u32(*value)), + Self::Binary(value) => read_u64(value)?, + Self::Array(value) => read_u64(&Self::Array(value.clone()).as_binary()?)?, + _ => 0, + }) + } + + pub fn as_real(&self) -> Result { + Ok(match self { + Self::Boolean(value) => f64::from(u8::from(*value)), + Self::Integer(value) => f64::from(*value), + Self::Real(value) => *value, + Self::String(value) => string_to_f64(value).unwrap_or(0.0), + _ => 0.0, + }) + } + + pub fn as_string(&self) -> Result { + Ok(match self { + Self::Boolean(value) => if *value { "1" } else { "0" }.to_owned(), + Self::Integer(value) => value.to_string(), + Self::Real(value) => format_real(*value), + Self::String(value) | Self::LlsdXml(value) => value.clone(), + Self::UUID(value) => value.to_string(), + Self::Date(value) => format_system_time(*value), + Self::Uri(value) => value.0.clone(), + Self::Binary(value) => base64::engine::general_purpose::STANDARD.encode(value), + _ => String::new(), + }) + } + + pub fn as_uuid(&self) -> Result { + match self { + Self::UUID(value) => Ok(*value), + Self::String(value) => { + Ok(UUID::new_with_string(value.clone()).unwrap_or_else(|_| UUID::zero())) + } + _ => Ok(UUID::zero()), + } + } + + pub fn as_date(&self) -> Result { + Ok(match self { + Self::Date(value) => *value, + Self::String(value) => parse_system_time(value).unwrap_or(UNIX_EPOCH), + _ => UNIX_EPOCH, + }) + } + + pub fn as_uri(&self) -> Result, Error> { + Ok(match self { + Self::Uri(value) => Some(value.clone()), + Self::String(value) if valid_uri_reference(value) => Some(Uri(value.clone())), + _ => None, + }) + } + + pub fn as_vector2(&self) -> Result { + match self { + Self::Array(value) if value.len() == 2 => Vector2::new_with_single_single( + value[0].as_real()? as f32, + value[1].as_real()? as f32, + ), + _ => Ok(Vector2::zero()), + } + } + + pub fn as_vector3(&self) -> Result { + match self { + Self::Array(value) if value.len() == 3 => Vector3::new_with_single_single_single( + value[0].as_real()? as f32, + value[1].as_real()? as f32, + value[2].as_real()? as f32, + ), + _ => Ok(Vector3::zero()), + } + } + + pub fn as_vector3d(&self) -> Result { + match self { + Self::Array(value) if value.len() == 3 => Vector3d::new_with_double_double_double( + value[0].as_real()?, + value[1].as_real()?, + value[2].as_real()?, + ), + _ => Ok(Vector3d::zero()), + } + } + + pub fn as_vector4(&self) -> Result { + match self { + Self::Array(value) if value.len() == 4 => { + Vector4::new_with_single_single_single_single( + value[0].as_real()? as f32, + value[1].as_real()? as f32, + value[2].as_real()? as f32, + value[3].as_real()? as f32, + ) + } + _ => Ok(Vector4::zero()), + } + } + + pub fn as_quaternion(&self) -> Result { + match self { + Self::Array(value) if value.len() == 4 => { + Quaternion::new_with_single_single_single_single( + value[0].as_real()? as f32, + value[1].as_real()? as f32, + value[2].as_real()? as f32, + value[3].as_real()? as f32, + ) + } + _ => Ok(Quaternion::identity()), + } + } + + pub fn as_color4(&self) -> Result { + match self { + Self::Array(value) if value.len() == 4 => Color4::new_with_single_single_single_single( + (value[0].as_real()? as f32).clamp(0.0, 1.0), + (value[1].as_real()? as f32).clamp(0.0, 1.0), + (value[2].as_real()? as f32).clamp(0.0, 1.0), + (value[3].as_real()? as f32).clamp(0.0, 1.0), + ), + _ => Ok(Color4::black()), + } + } + + pub fn copy(&self) -> Result { + Ok(self.clone()) + } + + pub fn from_boolean(value: bool) -> Result { + Ok(Self::Boolean(value)) + } + pub fn from_integer_with_int32(value: i32) -> Result { + Ok(Self::Integer(value)) + } + pub fn from_integer_with_u_int32(value: u32) -> Result { + Ok(Self::Integer(value as i32)) + } + pub fn from_integer_with_int16(value: i16) -> Result { + Ok(Self::Integer(i32::from(value))) + } + pub fn from_integer_with_u_int16(value: u16) -> Result { + Ok(Self::Integer(i32::from(value))) + } + pub fn from_integer_with_s_byte(value: i8) -> Result { + Ok(Self::Integer(i32::from(value))) + } + pub fn from_integer_with_byte(value: u8) -> Result { + Ok(Self::Integer(i32::from(value))) + } + pub fn from_u_integer(value: u32) -> Result { + Ok(Self::Binary(value.to_be_bytes().to_vec())) + } + pub fn from_long(value: i64) -> Result { + Ok(Self::Binary(value.to_be_bytes().to_vec())) + } + pub fn from_u_long(value: u64) -> Result { + Ok(Self::Binary(value.to_be_bytes().to_vec())) + } + pub fn from_real_with_double(value: f64) -> Result { + Ok(Self::Real(value)) + } + pub fn from_real_with_single(value: f32) -> Result { + Ok(Self::Real(f64::from(value))) + } + pub fn from_string(value: String) -> Result { + Ok(Self::String(value)) + } + pub fn from_uuid(value: UUID) -> Result { + Ok(Self::UUID(value)) + } + pub fn from_date(value: SystemTime) -> Result { + Ok(Self::Date(value)) + } + pub fn from_uri(value: Uri) -> Result { + Ok(Self::Uri(value)) + } + pub fn from_binary(value: Vec) -> Result { + Ok(Self::Binary(value)) + } + + pub fn from_vector2(value: Vector2) -> Result { + Ok(Self::Array(vec![ + Self::Real(f64::from(value.x)), + Self::Real(f64::from(value.y)), + ])) + } + pub fn from_vector3(value: Vector3) -> Result { + Ok(Self::Array(vec![ + Self::Real(f64::from(value.x)), + Self::Real(f64::from(value.y)), + Self::Real(f64::from(value.z)), + ])) + } + pub fn from_vector3d(value: Vector3d) -> Result { + Ok(Self::Array(vec![ + Self::Real(value.x), + Self::Real(value.y), + Self::Real(value.z), + ])) + } + pub fn from_vector4(value: Vector4) -> Result { + Ok(Self::Array(vec![ + Self::Real(f64::from(value.x)), + Self::Real(f64::from(value.y)), + Self::Real(f64::from(value.z)), + Self::Real(f64::from(value.w)), + ])) + } + pub fn from_quaternion(value: Quaternion) -> Result { + Ok(Self::Array(vec![ + Self::Real(f64::from(value.x)), + Self::Real(f64::from(value.y)), + Self::Real(f64::from(value.z)), + Self::Real(f64::from(value.w)), + ])) + } + pub fn from_color4(value: Color4) -> Result { + Ok(Self::Array(vec![ + Self::Real(f64::from(value.r)), + Self::Real(f64::from(value.g)), + Self::Real(f64::from(value.b)), + Self::Real(f64::from(value.a)), + ])) + } + + pub fn from_object(value: Object) -> Result { + object_to_osd(value) + } + + pub fn to_object(type_: TypeId, value: Self) -> Result { + let name = type_.0; + Ok(match name { + "System.String" | "string" => Object::String(value.as_string()?), + "System.Boolean" | "bool" => Object::Boolean(value.as_boolean()?), + "System.Int32" | "int" => Object::Integer(value.as_integer()?), + "System.UInt32" | "uint" => Object::UInteger(value.as_u_integer()?), + "System.Int64" | "long" => Object::Long(value.as_long()?), + "System.UInt64" | "ulong" => Object::ULong(value.as_u_long()?), + "System.Single" | "float" | "System.Double" | "double" => { + Object::Real(value.as_real()?) + } + "LibreMetaverse.UUID" | "UUID" => Object::UUID(value.as_uuid()?), + "LibreMetaverse.Vector2" | "Vector2" => Object::Vector2(value.as_vector2()?), + "LibreMetaverse.Vector3" | "Vector3" => Object::Vector3(value.as_vector3()?), + "LibreMetaverse.Vector3d" | "Vector3d" => Object::Vector3d(value.as_vector3d()?), + "LibreMetaverse.Vector4" | "Vector4" => Object::Vector4(value.as_vector4()?), + "LibreMetaverse.Quaternion" | "Quaternion" => { + Object::Quaternion(value.as_quaternion()?) + } + "LibreMetaverse.Color4" | "Color4" => Object::Color4(value.as_color4()?), + _ => osd_to_object(value)?, + }) + } + + pub fn serialize_members(obj: Object) -> Result { + match obj { + Object::Map(values) => OSDMap::new_with_dictionary( + values + .into_iter() + .map(|(key, value)| Ok((key, object_to_osd(value)?))) + .collect::>()?, + ), + value => { + let map = OSDMap::new_with_int32(1)?; + map.add_with_string_osd("value".to_owned(), object_to_osd(value)?)?; + Ok(map) + } + } + } + + pub fn deserialize_members(obj: &mut Object, serialized: OSDMap) -> Result<(), Error> { + if matches!(obj, Object::Map(_)) { + *obj = Object::Map( + serialized + .snapshot() + .into_iter() + .map(|(key, value)| Ok((key, osd_to_object(value)?))) + .collect::>()?, + ); + } else if let Some(value) = serialized.get("value") { + *obj = osd_to_object(value)?; + } + Ok(()) + } + + pub fn to_string(&self) -> String { + model_text(self) + } + + pub const fn type_(&self) -> OSDType { + match self { + Self::Undefined => OSDType::Unknown, + Self::Boolean(_) => OSDType::Boolean, + Self::Integer(_) => OSDType::Integer, + Self::Real(_) => OSDType::Real, + Self::String(_) => OSDType::String, + Self::UUID(_) => OSDType::UUID, + Self::Date(_) => OSDType::Date, + Self::Uri(_) => OSDType::URI, + Self::Binary(_) => OSDType::Binary, + Self::Map(_) => OSDType::Map, + Self::Array(_) => OSDType::Array, + Self::LlsdXml(_) => OSDType::LlsdXml, + } + } + + pub fn from_with_color4(value: Color4) -> Self { + Self::from_color4(value).expect("infallible conversion") + } + pub fn from_with_quaternion(value: Quaternion) -> Self { + Self::from_quaternion(value).expect("infallible conversion") + } + pub fn from_with_uuid(value: UUID) -> Self { + Self::UUID(value) + } + pub fn from_with_vector2(value: Vector2) -> Self { + Self::from_vector2(value).expect("infallible conversion") + } + pub fn from_with_vector3(value: Vector3) -> Self { + Self::from_vector3(value).expect("infallible conversion") + } + pub fn from_with_vector3d(value: Vector3d) -> Self { + Self::from_vector3d(value).expect("infallible conversion") + } + pub fn from_with_vector4(value: Vector4) -> Self { + Self::from_vector4(value).expect("infallible conversion") + } + pub const fn from_with_boolean(value: bool) -> Self { + Self::Boolean(value) + } + pub const fn from_with_byte(value: u8) -> Self { + Self::Integer(value as i32) + } + pub fn from_with_bytes(value: Vec) -> Self { + Self::Binary(value) + } + pub fn from_with_date_time(value: SystemTime) -> Self { + Self::Date(value) + } + pub const fn from_with_double(value: f64) -> Self { + Self::Real(value) + } + pub const fn from_with_int16(value: i16) -> Self { + Self::Integer(value as i32) + } + pub const fn from_with_int32(value: i32) -> Self { + Self::Integer(value) + } + pub fn from_with_int64(value: i64) -> Self { + Self::Binary(value.to_be_bytes().to_vec()) + } + pub const fn from_with_s_byte(value: i8) -> Self { + Self::Integer(value as i32) + } + pub const fn from_with_single(value: f32) -> Self { + Self::Real(value as f64) + } + pub fn from_with_string(value: String) -> Self { + Self::String(value) + } + pub const fn from_with_u_int16(value: u16) -> Self { + Self::Integer(value as i32) + } + pub const fn from_with_u_int32(value: u32) -> Self { + Self::Integer(value as i32) + } + pub fn from_with_u_int64(value: u64) -> Self { + Self::Binary(value.to_be_bytes().to_vec()) + } + pub fn from_with_uri(value: Uri) -> Self { + Self::Uri(value) + } + + pub fn from_with_osd(value: Self) -> Color4 { + value.as_color4().unwrap_or_else(|_| Color4::black()) + } + pub fn from_with_osd_b8ef4612(value: Self) -> Quaternion { + value + .as_quaternion() + .unwrap_or_else(|_| Quaternion::identity()) + } + pub fn from_with_osd_eba15316(value: Self) -> UUID { + value.as_uuid().unwrap_or_else(|_| UUID::zero()) + } + pub fn from_with_osd_e9aee905(value: Self) -> Vector2 { + value.as_vector2().unwrap_or_else(|_| Vector2::zero()) + } + pub fn from_with_osd_93c123bc(value: Self) -> Vector3 { + value.as_vector3().unwrap_or_else(|_| Vector3::zero()) + } + pub fn from_with_osd_d799abcc(value: Self) -> Vector3d { + value.as_vector3d().unwrap_or_else(|_| Vector3d::zero()) + } + pub fn from_with_osd_866cd1d2(value: Self) -> Vector4 { + value.as_vector4().unwrap_or_else(|_| Vector4::zero()) + } + pub fn from_with_osd_f50c5016(value: Self) -> bool { + value.as_boolean().unwrap_or(false) + } + pub fn from_with_osd_ffa78bdc(value: Self) -> Vec { + value.as_binary().unwrap_or_default() + } + pub fn from_with_osd_37aede2f(value: Self) -> SystemTime { + value.as_date().unwrap_or(UNIX_EPOCH) + } + pub fn from_with_osd_1b5df47b(value: Self) -> f64 { + value.as_real().unwrap_or(0.0) + } + pub fn from_with_osd_0d6b9c45(value: Self) -> i32 { + value.as_integer().unwrap_or(0) + } + pub fn from_with_osd_75ba279e(value: Self) -> i64 { + value.as_long().unwrap_or(0) + } + pub fn from_with_osd_232c9960(value: Self) -> f32 { + value.as_real().unwrap_or(0.0) as f32 + } + pub fn from_with_osd_853f4d5d(value: Self) -> String { + value.as_string().unwrap_or_default() + } + pub fn from_with_osd_6a01d439(value: Self) -> u32 { + value.as_u_integer().unwrap_or(0) + } + pub fn from_with_osd_1ae3c138(value: Self) -> u64 { + value.as_u_long().unwrap_or(0) + } + pub fn from_with_osd_8dbb79ec(value: Self) -> Option { + value.as_uri().unwrap_or(None) + } +} + +macro_rules! scalar_wrapper { + ($name:ident, $value:ty, $variant:ident, $kind:ident) => { + #[derive(Clone, Debug)] + pub struct $name { + value: $value, + } + impl $name { + pub fn new(value: $value) -> Result { + Ok(Self { value }) + } + pub fn copy(&self) -> Result { + Ok(OSD::$variant(self.value.clone())) + } + pub fn type_(&self) -> OSDType { + OSDType::$kind + } + pub fn to_string(&self) -> String { + OSD::$variant(self.value.clone()).to_string() + } + } + }; +} + +scalar_wrapper!(OSDBoolean, bool, Boolean, Boolean); +impl OSDBoolean { + pub fn as_binary(&self) -> Result, Error> { + OSD::Boolean(self.value).as_binary() + } + pub const fn as_boolean(&self) -> Result { + Ok(self.value) + } + pub fn as_integer(&self) -> Result { + Ok(i32::from(self.value)) + } + pub fn as_real(&self) -> Result { + Ok(f64::from(u8::from(self.value))) + } + pub fn as_string(&self) -> Result { + OSD::Boolean(self.value).as_string() + } +} + +scalar_wrapper!(OSDInteger, i32, Integer, Integer); +impl OSDInteger { + pub fn as_binary(&self) -> Result, Error> { + Ok(self.value.to_be_bytes().to_vec()) + } + pub const fn as_boolean(&self) -> Result { + Ok(self.value != 0) + } + pub const fn as_integer(&self) -> Result { + Ok(self.value) + } + pub fn as_long(&self) -> Result { + Ok(i64::from(self.value)) + } + pub fn as_real(&self) -> Result { + Ok(f64::from(self.value)) + } + pub fn as_string(&self) -> Result { + Ok(self.value.to_string()) + } + pub fn as_u_integer(&self) -> Result { + Ok(self.value as u32) + } + pub fn as_u_long(&self) -> Result { + Ok(self.value as u64) + } +} + +scalar_wrapper!(OSDReal, f64, Real, Real); +impl OSDReal { + pub fn as_binary(&self) -> Result, Error> { + Ok(self.value.to_be_bytes().to_vec()) + } + pub fn as_boolean(&self) -> Result { + OSD::Real(self.value).as_boolean() + } + pub fn as_integer(&self) -> Result { + Ok(real_to_i32(self.value)) + } + pub fn as_long(&self) -> Result { + Ok(real_to_i64(self.value)) + } + pub const fn as_real(&self) -> Result { + Ok(self.value) + } + pub fn as_string(&self) -> Result { + Ok(format_real(self.value)) + } + pub fn as_u_integer(&self) -> Result { + Ok(real_to_u32(self.value)) + } + pub fn as_u_long(&self) -> Result { + Ok(real_to_u64(self.value)) + } +} + +scalar_wrapper!(OSDString, String, String, String); +impl OSDString { + pub fn as_binary(&self) -> Result, Error> { + Ok(self.value.as_bytes().to_vec()) + } + pub fn as_boolean(&self) -> Result { + Ok(string_as_boolean(&self.value)) + } + pub fn as_date(&self) -> Result { + Ok(parse_system_time(&self.value).unwrap_or(UNIX_EPOCH)) + } + pub fn as_integer(&self) -> Result { + Ok(string_to_f64(&self.value).map_or(0, floor_to_i32)) + } + pub fn as_long(&self) -> Result { + Ok(string_to_f64(&self.value).map_or(0, floor_to_i64)) + } + pub fn as_real(&self) -> Result { + Ok(string_to_f64(&self.value).unwrap_or(0.0)) + } + pub fn as_string(&self) -> Result { + Ok(self.value.clone()) + } + pub fn as_u_integer(&self) -> Result { + Ok(string_to_f64(&self.value).map_or(0, floor_to_u32)) + } + pub fn as_u_long(&self) -> Result { + Ok(string_to_f64(&self.value).map_or(0, floor_to_u64)) + } + pub fn as_uuid(&self) -> Result { + OSD::String(self.value.clone()).as_uuid() + } + pub fn as_uri(&self) -> Result, Error> { + OSD::String(self.value.clone()).as_uri() + } +} + +scalar_wrapper!(OSDUUID, UUID, UUID, UUID); +impl OSDUUID { + pub fn as_binary(&self) -> Result, Error> { + self.value.get_bytes() + } + pub fn as_boolean(&self) -> Result { + Ok(self.value != UUID::zero()) + } + pub fn as_string(&self) -> Result { + Ok(self.value.to_string()) + } + pub const fn as_uuid(&self) -> Result { + Ok(self.value) + } +} + +scalar_wrapper!(OSDDate, SystemTime, Date, Date); +impl OSDDate { + pub fn as_binary(&self) -> Result, Error> { + Ok(unix_seconds_f64(self.value).to_le_bytes().to_vec()) + } + pub const fn as_date(&self) -> Result { + Ok(self.value) + } + pub fn as_integer(&self) -> Result { + Ok(unix_seconds_u32(self.value) as i32) + } + pub fn as_long(&self) -> Result { + Ok(i64::from(unix_seconds_u32(self.value))) + } + pub fn as_string(&self) -> Result { + Ok(format_system_time(self.value)) + } + pub fn as_u_integer(&self) -> Result { + Ok(unix_seconds_u32(self.value)) + } + pub fn as_u_long(&self) -> Result { + Ok(u64::from(unix_seconds_u32(self.value))) + } +} + +#[derive(Clone, Debug)] +pub struct OSDUri { + value: Uri, +} +impl OSDUri { + pub fn new(uri: Uri) -> Result { + Ok(Self { value: uri }) + } + pub fn as_binary(&self) -> Result, Error> { + Ok(self.value.0.as_bytes().to_vec()) + } + pub fn as_string(&self) -> Result { + Ok(self.value.0.clone()) + } + pub fn as_uri(&self) -> Result { + Ok(self.value.clone()) + } + pub fn copy(&self) -> Result { + Ok(OSD::Uri(self.value.clone())) + } + pub fn to_string(&self) -> String { + self.value.0.clone() + } + pub const fn type_(&self) -> OSDType { + OSDType::URI + } +} + +#[derive(Clone, Debug)] +pub struct OSDLlsdXml { + pub value: String, +} +impl OSDLlsdXml { + pub fn new(value: String) -> Result { + Ok(Self { value }) + } + pub fn as_binary(&self) -> Result, Error> { + Ok(self.value.as_bytes().to_vec()) + } + pub fn as_string(&self) -> Result { + Ok(self.value.clone()) + } + pub fn copy(&self) -> Result { + Ok(OSD::LlsdXml(self.value.clone())) + } + pub fn to_string(&self) -> String { + self.value.clone() + } + pub const fn type_(&self) -> OSDType { + OSDType::LlsdXml + } +} + +#[derive(Clone, Debug)] +pub struct OSDBinary { + value: Vec, +} +impl OSDBinary { + pub fn new_with_bytes(value: Vec) -> Result { + Ok(Self { value }) + } + pub fn new_with_int64(value: i64) -> Result { + Ok(Self { + value: value.to_be_bytes().to_vec(), + }) + } + pub fn new_with_u_int32(value: u32) -> Result { + Ok(Self { + value: value.to_be_bytes().to_vec(), + }) + } + pub fn new_with_u_int64(value: u64) -> Result { + Ok(Self { + value: value.to_be_bytes().to_vec(), + }) + } + pub fn as_binary(&self) -> Result, Error> { + Ok(self.value.clone()) + } + pub fn as_long(&self) -> Result { + read_i64(&self.value) + } + pub fn as_string(&self) -> Result { + Ok(base64::engine::general_purpose::STANDARD.encode(&self.value)) + } + pub fn as_u_integer(&self) -> Result { + read_u32(&self.value) + } + pub fn as_u_long(&self) -> Result { + read_u64(&self.value) + } + pub fn copy(&self) -> Result { + Ok(OSD::Binary(self.value.clone())) + } + pub fn to_string(&self) -> String { + self.value + .iter() + .map(|byte| format!("{byte:02X}")) + .collect() + } + pub const fn type_(&self) -> OSDType { + OSDType::Binary + } +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct OSDException { + pub message: String, + pub inner_exception: Option, +} +impl OSDException { + pub fn new_with_constructor() -> Result { + Ok(Self::default()) + } + pub fn new_with_string(message: String) -> Result { + Ok(Self { + message, + inner_exception: None, + }) + } + pub fn new_with_string_exception( + message: String, + inner_exception: ExternalError, + ) -> Result { + Ok(Self { + message, + inner_exception: Some(inner_exception), + }) + } +} + +/// Mutable OSD sequence with C#-compatible indexing and conversion behavior. +/// +/// Reads and [`Self::copy`] return owned structural snapshots. Mutation is +/// synchronized, but callers should not infer transactional behavior across +/// multiple calls. +pub struct OSDArray { + values: RwLock>, +} +impl Clone for OSDArray { + fn clone(&self) -> Self { + Self { + values: RwLock::new(self.snapshot()), + } + } +} +impl OSDArray { + pub fn new_with_constructor() -> Result { + Ok(Self { + values: RwLock::new(Vec::new()), + }) + } + pub fn new_with_list(value: Vec) -> Result { + Ok(Self { + values: RwLock::new(value), + }) + } + pub fn new_with_int32(capacity: i32) -> Result { + let capacity = usize::try_from(capacity).map_err(|_| Error::Argument)?; + Ok(Self { + values: RwLock::new(Vec::with_capacity(capacity)), + }) + } + fn read(&self) -> RwLockReadGuard<'_, Vec> { + self.values + .read() + .unwrap_or_else(std::sync::PoisonError::into_inner) + } + fn write(&self) -> RwLockWriteGuard<'_, Vec> { + self.values + .write() + .unwrap_or_else(std::sync::PoisonError::into_inner) + } + pub fn snapshot(&self) -> Vec { + self.read().clone() + } + pub fn add(&self, llsd: OSD) -> Result<(), Error> { + self.write().push(llsd); + Ok(()) + } + pub fn as_binary(&self) -> Result, Error> { + OSD::Array(self.snapshot()).as_binary() + } + pub fn as_boolean(&self) -> Result { + Ok(!self.read().is_empty()) + } + pub fn as_color4(&self) -> Result { + OSD::Array(self.snapshot()).as_color4() + } + pub fn as_long(&self) -> Result { + OSD::Array(self.snapshot()).as_long() + } + pub fn as_quaternion(&self) -> Result { + OSD::Array(self.snapshot()).as_quaternion() + } + pub fn as_u_integer(&self) -> Result { + OSD::Array(self.snapshot()).as_u_integer() + } + pub fn as_u_long(&self) -> Result { + OSD::Array(self.snapshot()).as_u_long() + } + pub fn as_vector2(&self) -> Result { + OSD::Array(self.snapshot()).as_vector2() + } + pub fn as_vector3(&self) -> Result { + OSD::Array(self.snapshot()).as_vector3() + } + pub fn as_vector3d(&self) -> Result { + OSD::Array(self.snapshot()).as_vector3d() + } + pub fn as_vector4(&self) -> Result { + OSD::Array(self.snapshot()).as_vector4() + } + pub fn clear(&self) -> Result<(), Error> { + self.write().clear(); + Ok(()) + } + pub fn contains_with_osd(&self, llsd: OSD) -> Result { + Ok(self.read().contains(&llsd)) + } + pub fn contains_with_string(&self, element: String) -> Result { + Ok(self + .read() + .iter() + .any(|value| matches!(value, OSD::String(text) if text == &element))) + } + pub fn copy(&self) -> Result { + Ok(OSD::Array(self.snapshot())) + } + pub fn copy_to(&self, array: &mut [OSD], index: i32) -> Result<(), Error> { + let index = usize::try_from(index).map_err(|_| Error::Argument)?; + let values = self.read(); + let destination = array + .get_mut(index..index.checked_add(values.len()).ok_or(Error::Argument)?) + .ok_or(Error::Argument)?; + destination.clone_from_slice(&values); + Ok(()) + } + pub fn index_of(&self, item: OSD) -> Result { + Ok(self + .read() + .iter() + .position(|value| value == &item) + .map_or(-1, |index| index as i32)) + } + pub fn insert(&self, index: i32, item: OSD) -> Result<(), Error> { + let index = usize::try_from(index).map_err(|_| Error::IndexOutOfRange)?; + let mut values = self.write(); + if index > values.len() { + return Err(Error::IndexOutOfRange); + } + values.insert(index, item); + Ok(()) + } + pub fn remove(&self, llsd: OSD) -> Result { + let mut values = self.write(); + if let Some(index) = values.iter().position(|value| value == &llsd) { + values.remove(index); + Ok(true) + } else { + Ok(false) + } + } + pub fn remove_at(&self, index: i32) -> Result<(), Error> { + let index = usize::try_from(index).map_err(|_| Error::IndexOutOfRange)?; + let mut values = self.write(); + if index >= values.len() { + return Err(Error::IndexOutOfRange); + } + values.remove(index); + Ok(()) + } + pub fn to_array_list(&self) -> Result { + Ok(ArrayList( + self.snapshot() + .into_iter() + .map(osd_to_object) + .collect::>()?, + )) + } + pub fn to_string(&self) -> String { + model_text(&OSD::Array(self.snapshot())) + } + pub fn count(&self) -> i32 { + self.read().len() as i32 + } + pub const fn is_read_only(&self) -> bool { + false + } + pub fn item(&self, index: i32) -> OSD { + self.read()[usize::try_from(index).expect("negative OSDArray index")].clone() + } + pub fn set_item(&mut self, index: i32, value: OSD) { + self.write()[usize::try_from(index).expect("negative OSDArray index")] = value; + } + pub const fn type_(&self) -> OSDType { + OSDType::Array + } +} + +/// Mutable string-keyed OSD map. +/// +/// Missing index lookups return [`OSD::Undefined`], duplicate `add` operations +/// fail, and setters replace existing values. Key, value, copy, and conversion +/// results are owned snapshots. The public map has no iteration-order promise; +/// snapshot helpers sort keys when a stable order is useful. +pub struct OSDMap { + values: RwLock>, +} +impl Clone for OSDMap { + fn clone(&self) -> Self { + Self { + values: RwLock::new(self.snapshot()), + } + } +} +impl OSDMap { + pub fn new_with_constructor() -> Result { + Ok(Self { + values: RwLock::new(HashMap::new()), + }) + } + pub fn new_with_dictionary(value: HashMap) -> Result { + Ok(Self { + values: RwLock::new(value), + }) + } + pub fn new_with_int32(capacity: i32) -> Result { + let capacity = usize::try_from(capacity).map_err(|_| Error::Argument)?; + Ok(Self { + values: RwLock::new(HashMap::with_capacity(capacity)), + }) + } + fn read(&self) -> RwLockReadGuard<'_, HashMap> { + self.values + .read() + .unwrap_or_else(std::sync::PoisonError::into_inner) + } + fn write(&self) -> RwLockWriteGuard<'_, HashMap> { + self.values + .write() + .unwrap_or_else(std::sync::PoisonError::into_inner) + } + pub fn snapshot(&self) -> HashMap { + self.read().clone() + } + pub fn get(&self, key: &str) -> Option { + self.read().get(key).cloned() + } + pub fn add_with_key_value_pair(&self, kvp: (String, OSD)) -> Result<(), Error> { + self.add_with_string_osd(kvp.0, kvp.1) + } + pub fn add_with_string_osd(&self, key: String, llsd: OSD) -> Result<(), Error> { + let mut values = self.write(); + if values.contains_key(&key) { + return Err(Error::Argument); + } + values.insert(key, llsd); + Ok(()) + } + pub fn as_boolean(&self) -> Result { + Ok(!self.read().is_empty()) + } + pub fn clear(&self) -> Result<(), Error> { + self.write().clear(); + Ok(()) + } + pub fn contains(&self, kvp: (String, OSD)) -> Result { + Ok(self.read().get(&kvp.0) == Some(&kvp.1)) + } + pub fn contains_key(&self, key: String) -> Result { + Ok(self.read().contains_key(&key)) + } + pub fn copy(&self) -> Result { + Ok(OSD::Map(self.snapshot())) + } + pub fn copy_to(&self, array: &mut [(String, OSD)], index: i32) -> Result<(), Error> { + let index = usize::try_from(index).map_err(|_| Error::Argument)?; + let mut entries: Vec<_> = self.snapshot().into_iter().collect(); + entries.sort_unstable_by_key(|(key, _)| key.clone()); + let destination = array + .get_mut(index..index.checked_add(entries.len()).ok_or(Error::Argument)?) + .ok_or(Error::Argument)?; + destination.clone_from_slice(&entries); + Ok(()) + } + pub const fn get_enumerator(&self) -> Result { + Ok(IDictionaryEnumerator) + } + pub fn remove_with_key_value_pair(&self, kvp: (String, OSD)) -> Result { + Ok(self.write().remove(&kvp.0).is_some()) + } + pub fn remove_with_string(&self, key: String) -> Result { + Ok(self.write().remove(&key).is_some()) + } + pub fn to_hashtable(&self) -> Result { + Ok(Hashtable( + self.snapshot() + .into_iter() + .map(|(key, value)| Ok((Object::String(key), osd_to_object(value)?))) + .collect::>()?, + )) + } + pub fn to_string(&self) -> String { + model_text(&OSD::Map(self.snapshot())) + } + pub fn try_get_value(&self, key: String, llsd: &mut OSD) -> bool { + if let Some(value) = self.get(&key) { + *llsd = value; + true + } else { + false + } + } + pub fn count(&self) -> i32 { + self.read().len() as i32 + } + pub const fn is_read_only(&self) -> bool { + false + } + pub fn item(&self, key: String) -> OSD { + self.get(&key).unwrap_or_default() + } + pub fn set_item(&mut self, key: String, value: OSD) { + self.write().insert(key, value); + } + pub fn keys(&self) -> Vec { + let mut keys: Vec<_> = self.read().keys().cloned().collect(); + keys.sort_unstable(); + keys + } + pub const fn type_(&self) -> OSDType { + OSDType::Map + } + pub fn values(&self) -> Vec { + let mut entries: Vec<_> = self + .read() + .iter() + .map(|(key, value)| (key.clone(), value.clone())) + .collect(); + entries.sort_unstable_by(|(left, _), (right, _)| left.cmp(right)); + entries.into_iter().map(|(_, value)| value).collect() + } +} + +fn read_u32(bytes: &[u8]) -> Result { + Ok(u32::from_be_bytes( + bytes + .get(..4) + .ok_or(Error::IndexOutOfRange)? + .try_into() + .map_err(|_| Error::IndexOutOfRange)?, + )) +} +fn read_i64(bytes: &[u8]) -> Result { + Ok(i64::from_be_bytes( + bytes + .get(..8) + .ok_or(Error::IndexOutOfRange)? + .try_into() + .map_err(|_| Error::IndexOutOfRange)?, + )) +} +fn read_u64(bytes: &[u8]) -> Result { + Ok(u64::from_be_bytes( + bytes + .get(..8) + .ok_or(Error::IndexOutOfRange)? + .try_into() + .map_err(|_| Error::IndexOutOfRange)?, + )) +} +fn string_as_boolean(value: &str) -> bool { + !value.is_empty() && value != "0" && !value.eq_ignore_ascii_case("false") +} +fn string_to_f64(value: &str) -> Option { + value.trim().parse().ok() +} +fn floor_to_i32(value: f64) -> i32 { + if value.is_nan() { + 0 + } else { + value + .floor() + .clamp(f64::from(i32::MIN), f64::from(i32::MAX)) as i32 + } +} +fn floor_to_u32(value: f64) -> u32 { + if value.is_nan() { + 0 + } else { + value.floor().clamp(0.0, f64::from(u32::MAX)) as u32 + } +} +fn floor_to_i64(value: f64) -> i64 { + if value.is_nan() { + 0 + } else if value <= i64::MIN as f64 { + i64::MIN + } else if value >= i64::MAX as f64 { + i64::MAX + } else { + value.floor() as i64 + } +} +fn floor_to_u64(value: f64) -> u64 { + if value.is_nan() || value <= 0.0 { + 0 + } else if value >= u64::MAX as f64 { + u64::MAX + } else { + value.floor() as u64 + } +} +fn real_to_i32(value: f64) -> i32 { + if value.is_nan() { + 0 + } else { + value + .round_ties_even() + .clamp(f64::from(i32::MIN), f64::from(i32::MAX)) as i32 + } +} +fn real_to_u32(value: f64) -> u32 { + if value.is_nan() { + 0 + } else { + value.round_ties_even().clamp(0.0, f64::from(u32::MAX)) as u32 + } +} +fn real_to_i64(value: f64) -> i64 { + if value.is_nan() { + 0 + } else if value <= i64::MIN as f64 { + i64::MIN + } else if value >= i64::MAX as f64 { + i64::MAX + } else { + value.round_ties_even() as i64 + } +} +fn real_to_u64(value: f64) -> u64 { + if value.is_nan() || value <= 0.0 { + 0 + } else if value > u64::MAX as f64 { + i32::MAX as u64 + } else { + value.round_ties_even() as u64 + } +} +fn format_real(value: f64) -> String { + if value.is_nan() { + "NaN".to_owned() + } else if value == f64::INFINITY { + "Infinity".to_owned() + } else if value == f64::NEG_INFINITY { + "-Infinity".to_owned() + } else { + value.to_string() + } +} +fn unix_seconds_f64(value: SystemTime) -> f64 { + match value.duration_since(UNIX_EPOCH) { + Ok(duration) => duration.as_secs_f64(), + Err(error) => -error.duration().as_secs_f64(), + } +} +fn unix_seconds_u32(value: SystemTime) -> u32 { + match value.duration_since(UNIX_EPOCH) { + Ok(duration) => duration.as_secs() as u32, + Err(error) => (-(error.duration().as_secs() as i64)) as u32, + } +} + +fn format_system_time(value: SystemTime) -> String { + let (whole, nanos) = match value.duration_since(UNIX_EPOCH) { + Ok(duration) => (duration.as_secs() as i64, duration.subsec_nanos()), + Err(error) => { + let duration = error.duration(); + if duration.subsec_nanos() == 0 { + (-(duration.as_secs() as i64), 0) + } else { + ( + -(duration.as_secs() as i64) - 1, + 1_000_000_000 - duration.subsec_nanos(), + ) + } + } + }; + let hundredths = (nanos / 10_000_000) as u8; + let (year, month, day, hour, minute, second) = civil_from_unix(whole); + if nanos / 1_000_000 > 0 { + format!("{year:04}-{month:02}-{day:02}T{hour:02}:{minute:02}:{second:02}.{hundredths:02}Z") + } else { + format!("{year:04}-{month:02}-{day:02}T{hour:02}:{minute:02}:{second:02}Z") + } +} + +fn civil_from_unix(seconds: i64) -> (i32, u32, u32, u32, u32, u32) { + let days = seconds.div_euclid(86_400); + let day_seconds = seconds.rem_euclid(86_400); + let z = days + 719_468; + let era = if z >= 0 { z } else { z - 146_096 }.div_euclid(146_097); + let doe = z - era * 146_097; + let yoe = (doe - doe / 1_460 + doe / 36_524 - doe / 146_096) / 365; + let mut year = yoe + era * 400; + let doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + let mp = (5 * doy + 2) / 153; + let day = doy - (153 * mp + 2) / 5 + 1; + let month = mp + if mp < 10 { 3 } else { -9 }; + year += i64::from(month <= 2); + ( + year as i32, + month as u32, + day as u32, + (day_seconds / 3_600) as u32, + ((day_seconds % 3_600) / 60) as u32, + (day_seconds % 60) as u32, + ) +} + +fn parse_system_time(value: &str) -> Option { + let value = value.trim(); + let (date, time) = value.split_once('T').or_else(|| value.split_once(' '))?; + let mut date_parts = date.split('-'); + let year: i32 = date_parts.next()?.parse().ok()?; + let month: u32 = date_parts.next()?.parse().ok()?; + let day: u32 = date_parts.next()?.parse().ok()?; + if date_parts.next().is_some() || !(1..=12).contains(&month) || !(1..=31).contains(&day) { + return None; + } + let time = time.strip_suffix('Z').unwrap_or(time); + let (clock, fraction) = time.split_once('.').map_or((time, ""), |parts| parts); + let mut time_parts = clock.split(':'); + let hour: u32 = time_parts.next()?.parse().ok()?; + let minute: u32 = time_parts.next()?.parse().ok()?; + let second: u32 = time_parts.next()?.parse().ok()?; + if time_parts.next().is_some() || hour > 23 || minute > 59 || second > 59 { + return None; + } + let days = days_from_civil(year, month, day)?; + let whole = days + .checked_mul(86_400)? + .checked_add(i64::from(hour * 3_600 + minute * 60 + second))?; + let nanos = if fraction.is_empty() { + 0 + } else { + let digits = fraction.as_bytes(); + if digits.len() > 9 || !digits.iter().all(u8::is_ascii_digit) { + return None; + } + fraction + .parse::() + .ok()? + .checked_mul(10_u32.pow((9 - digits.len()) as u32))? + }; + if whole >= 0 { + UNIX_EPOCH.checked_add(Duration::new(whole as u64, nanos)) + } else if nanos == 0 { + UNIX_EPOCH.checked_sub(Duration::from_secs(whole.unsigned_abs())) + } else { + UNIX_EPOCH.checked_sub(Duration::new( + whole.unsigned_abs() - 1, + 1_000_000_000 - nanos, + )) + } +} + +fn days_from_civil(year: i32, month: u32, day: u32) -> Option { + let max_day = match month { + 2 if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) => 29, + 2 => 28, + 4 | 6 | 9 | 11 => 30, + 1 | 3 | 5 | 7 | 8 | 10 | 12 => 31, + _ => return None, + }; + if day == 0 || day > max_day { + return None; + } + let adjusted_year = i64::from(year) - i64::from(month <= 2); + let era = adjusted_year.div_euclid(400); + let yoe = adjusted_year - era * 400; + let adjusted_month = i64::from(month) + if month > 2 { -3 } else { 9 }; + let doy = (153 * adjusted_month + 2) / 5 + i64::from(day) - 1; + let doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; + Some(era * 146_097 + doe - 719_468) +} + +fn valid_uri_reference(value: &str) -> bool { + !value.chars().any(char::is_whitespace) && !value.chars().any(char::is_control) +} + +fn escape_text(value: &str) -> String { + let mut output = String::with_capacity(value.len() + 2); + output.push('"'); + for character in value.chars() { + match character { + '"' => output.push_str("\\\""), + '\\' => output.push_str("\\\\"), + '\n' => output.push_str("\\n"), + '\r' => output.push_str("\\r"), + '\t' => output.push_str("\\t"), + character if character.is_control() => { + write!(output, "\\u{:04x}", character as u32) + .expect("writing to String is infallible"); + } + character => output.push(character), + } + } + output.push('"'); + output +} + +fn model_text(value: &OSD) -> String { + match value { + OSD::Undefined => "undef".to_owned(), + OSD::Boolean(_) + | OSD::Integer(_) + | OSD::Real(_) + | OSD::UUID(_) + | OSD::Date(_) + | OSD::Uri(_) + | OSD::Binary(_) => value.as_string().unwrap_or_default(), + OSD::String(text) | OSD::LlsdXml(text) => text.clone(), + OSD::Array(_) | OSD::Map(_) => json_text_with_defaults(value), + } +} + +fn json_text_with_defaults(value: &OSD) -> String { + match value { + OSD::Undefined => "null".to_owned(), + OSD::Boolean(value) => value.to_string(), + OSD::Integer(value) => value.to_string(), + OSD::Real(value) => format_real(*value), + OSD::String(value) => escape_text(value), + OSD::LlsdXml(_) => "null".to_owned(), + OSD::UUID(_) | OSD::Date(_) | OSD::Uri(_) => { + escape_text(&value.as_string().unwrap_or_default()) + } + OSD::Binary(bytes) => format!( + "[{}]", + bytes + .iter() + .map(u8::to_string) + .collect::>() + .join(",") + ), + OSD::Array(values) => format!( + "[{}]", + values + .iter() + .map(json_text_with_defaults) + .collect::>() + .join(",") + ), + OSD::Map(values) => { + let mut entries: Vec<_> = values.iter().collect(); + entries.sort_unstable_by_key(|(key, _)| *key); + format!( + "{{{}}}", + entries + .into_iter() + .map(|(key, value)| { + format!("{}:{}", escape_text(key), json_text_with_defaults(value)) + }) + .collect::>() + .join(",") + ) + } + } +} + +fn object_to_osd(value: Object) -> Result { + Ok(match value { + Object::Undefined => OSD::Undefined, + Object::Boolean(value) => OSD::Boolean(value), + Object::Integer(value) => OSD::Integer(value), + Object::UInteger(value) => OSD::Binary(value.to_be_bytes().to_vec()), + Object::Long(value) => OSD::Binary(value.to_be_bytes().to_vec()), + Object::ULong(value) => OSD::Binary(value.to_be_bytes().to_vec()), + Object::Real(value) => OSD::Real(value), + Object::String(value) => OSD::String(value), + Object::UUID(value) => OSD::UUID(value), + Object::Date(value) => OSD::Date(value), + Object::Bytes(value) => OSD::Binary(value), + Object::Uri(value) => OSD::Uri(value), + Object::Array(values) => OSD::Array( + values + .into_iter() + .map(object_to_osd) + .collect::>()?, + ), + Object::Map(values) => OSD::Map( + values + .into_iter() + .map(|(key, value)| Ok((key, object_to_osd(value)?))) + .collect::>()?, + ), + Object::Vector2(value) => OSD::from_vector2(value)?, + Object::Vector3(value) => OSD::from_vector3(value)?, + Object::Vector3d(value) => OSD::from_vector3d(value)?, + Object::Vector4(value) => OSD::from_vector4(value)?, + Object::Quaternion(value) => OSD::from_quaternion(value)?, + Object::Color4(value) => OSD::from_color4(value)?, + Object::Matrix4(_) => OSD::Undefined, + }) +} + +fn osd_to_object(value: OSD) -> Result { + Ok(match value { + OSD::Undefined => Object::Undefined, + OSD::Boolean(value) => Object::Boolean(value), + OSD::Integer(value) => Object::Integer(value), + OSD::Real(value) => Object::Real(value), + OSD::String(value) | OSD::LlsdXml(value) => Object::String(value), + OSD::UUID(value) => Object::UUID(value), + OSD::Date(value) => Object::Date(value), + OSD::Uri(value) => Object::Uri(value), + OSD::Binary(value) => Object::Bytes(value), + OSD::Array(values) => Object::Array( + values + .into_iter() + .map(osd_to_object) + .collect::>()?, + ), + OSD::Map(values) => Object::Map( + values + .into_iter() + .map(|(key, value)| Ok((key, osd_to_object(value)?))) + .collect::>()?, + ), + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::hash_map::DefaultHasher; + + #[test] + fn scalar_conversions_match_reference_edges() { + assert_eq!(OSD::Real(2.5).as_integer(), Ok(2)); + assert_eq!(OSD::Real(3.5).as_integer(), Ok(4)); + assert_eq!(OSD::Real(f64::NAN).as_integer(), Ok(0)); + assert_eq!(OSD::String("-1.2".into()).as_integer(), Ok(-2)); + assert_eq!(OSD::String("FALSE".into()).as_boolean(), Ok(false)); + assert_eq!(OSD::Integer(-1).as_u_integer(), Ok(u32::MAX)); + } + + #[test] + fn binary_numeric_conversions_are_network_order() { + let value = OSDBinary::new_with_u_int64(0x0102_0304_0506_0708).unwrap(); + assert_eq!(value.as_binary().unwrap(), vec![1, 2, 3, 4, 5, 6, 7, 8]); + assert_eq!(value.as_u_long(), Ok(0x0102_0304_0506_0708)); + assert_eq!( + OSDBinary::new_with_u_int32(0x0102_0304) + .unwrap() + .as_u_integer(), + Ok(0x0102_0304) + ); + } + + #[test] + fn arrays_mutate_and_convert_without_leaking_borrows() { + let array = OSDArray::new_with_constructor().unwrap(); + array.add(OSD::Real(1.0)).unwrap(); + array.add(OSD::Real(2.0)).unwrap(); + array.add(OSD::Real(3.0)).unwrap(); + assert_eq!( + array.as_vector3().unwrap(), + Vector3 { + x: 1.0, + y: 2.0, + z: 3.0 + } + ); + assert_eq!(array.count(), 3); + assert!(array.remove(OSD::Real(2.0)).unwrap()); + assert_eq!(array.snapshot(), vec![OSD::Real(1.0), OSD::Real(3.0)]); + } + + #[test] + fn maps_have_undefined_index_default_and_snapshot_copy() { + let mut map = OSDMap::new_with_constructor().unwrap(); + map.add_with_string_osd("answer".into(), OSD::Integer(42)) + .unwrap(); + assert_eq!(map.item("missing".into()), OSD::Undefined); + assert_eq!(map.item("answer".into()), OSD::Integer(42)); + map.set_item("answer".into(), OSD::Integer(43)); + assert_eq!(map.item("answer".into()), OSD::Integer(43)); + assert!( + map.add_with_string_osd("answer".into(), OSD::Integer(44)) + .is_err() + ); + map.set_item( + "values".into(), + OSD::Array(vec![ + OSD::Boolean(true), + OSD::String("quoted\"text".into()), + OSD::Binary(vec![1, 2]), + OSD::Undefined, + ]), + ); + assert_eq!( + map.to_string(), + r#"{"answer":43,"values":[true,"quoted\"text",[1,2],null]}"# + ); + } + + #[test] + fn structural_map_hash_is_independent_of_hashmap_iteration() { + let left = OSD::Map(HashMap::from([ + ("a".into(), OSD::Integer(1)), + ("b".into(), OSD::Integer(2)), + ])); + let right = OSD::Map(HashMap::from([ + ("b".into(), OSD::Integer(2)), + ("a".into(), OSD::Integer(1)), + ])); + let hash = |value: &OSD| { + let mut hasher = DefaultHasher::new(); + value.hash(&mut hasher); + hasher.finish() + }; + assert_eq!(left, right); + assert_eq!(hash(&left), hash(&right)); + } + + #[test] + fn nesting_limits_reject_depth_nodes_and_binary_allocation() { + let nested = OSD::Array(vec![OSD::Array(vec![OSD::Binary(vec![0; 4])])]); + assert_eq!(nested.validate_limits(2, 3, 4), Ok(())); + assert_eq!(nested.validate_limits(1, 3, 4), Err(Error::Argument)); + assert_eq!(nested.validate_limits(2, 2, 4), Err(Error::Argument)); + assert_eq!(nested.validate_limits(2, 3, 3), Err(Error::Argument)); + } + + #[test] + fn utc_dates_round_trip_reference_text_and_little_endian_binary() { + let date = UNIX_EPOCH + Duration::new(1_704_164_645, 120_000_000); + let osd = OSDDate::new(date).unwrap(); + assert_eq!(osd.as_string().unwrap(), "2024-01-02T03:04:05.12Z"); + assert_eq!( + OSDString::new("2024-01-02T03:04:05.12Z".into()) + .unwrap() + .as_date() + .unwrap(), + date + ); + assert_eq!(osd.as_binary().unwrap(), 1_704_164_645.12_f64.to_le_bytes()); + let pre_epoch = OSDString::new("1969-12-31T23:59:59.50Z".into()) + .unwrap() + .as_date() + .unwrap(); + assert_eq!(pre_epoch, UNIX_EPOCH - Duration::from_millis(500)); + assert_eq!( + OSDDate::new(pre_epoch).unwrap().as_string().unwrap(), + "1969-12-31T23:59:59.50Z" + ); + assert_eq!( + OSDDate::new(UNIX_EPOCH + Duration::from_millis(1)) + .unwrap() + .as_string() + .unwrap(), + "1970-01-01T00:00:00.00Z" + ); + assert_eq!( + OSDDate::new(UNIX_EPOCH - Duration::from_secs(1)) + .unwrap() + .as_u_integer(), + Ok(u32::MAX) + ); + } + + #[test] + fn object_bridge_preserves_unsigned_numeric_kinds() { + assert_eq!( + OSD::from_object(Object::UInteger(0xFEDC_BA98)).unwrap(), + OSD::Binary(vec![0xFE, 0xDC, 0xBA, 0x98]) + ); + assert_eq!( + OSD::to_object( + TypeId("System.UInt64"), + OSD::Binary(u64::MAX.to_be_bytes().to_vec()) + ), + Ok(Object::ULong(u64::MAX)) + ); + } +} diff --git a/crates/libremetaverse-types/src/compat.rs b/crates/libremetaverse-types/src/compat.rs index 9f3923d..a348c83 100644 --- a/crates/libremetaverse-types/src/compat.rs +++ b/crates/libremetaverse-types/src/compat.rs @@ -22,7 +22,19 @@ impl ReadWrite for T {} #[derive(Clone, Debug)] pub enum Object { + Undefined, + Boolean(bool), + Integer(i32), + UInteger(u32), + Long(i64), + ULong(u64), + Real(f64), Color4(crate::Color4), + Date(std::time::SystemTime), + Bytes(Vec), + Uri(Uri), + Array(Vec), + Map(std::collections::HashMap), Matrix4(crate::Matrix4), Quaternion(crate::Quaternion), String(String), @@ -36,6 +48,18 @@ pub enum Object { impl PartialEq for Object { fn eq(&self, other: &Self) -> bool { match (self, other) { + (Self::Undefined, Self::Undefined) => true, + (Self::Boolean(lhs), Self::Boolean(rhs)) => lhs == rhs, + (Self::Integer(lhs), Self::Integer(rhs)) => lhs == rhs, + (Self::UInteger(lhs), Self::UInteger(rhs)) => lhs == rhs, + (Self::Long(lhs), Self::Long(rhs)) => lhs == rhs, + (Self::ULong(lhs), Self::ULong(rhs)) => lhs == rhs, + (Self::Real(lhs), Self::Real(rhs)) => lhs.to_bits() == rhs.to_bits(), + (Self::Date(lhs), Self::Date(rhs)) => lhs == rhs, + (Self::Bytes(lhs), Self::Bytes(rhs)) => lhs == rhs, + (Self::Uri(lhs), Self::Uri(rhs)) => lhs == rhs, + (Self::Array(lhs), Self::Array(rhs)) => lhs == rhs, + (Self::Map(lhs), Self::Map(rhs)) => lhs == rhs, (Self::Color4(lhs), Self::Color4(rhs)) => crate::Color4::eq(*lhs, *rhs), (Self::Matrix4(lhs), Self::Matrix4(rhs)) => crate::Matrix4::eq(*lhs, *rhs), (Self::Quaternion(lhs), Self::Quaternion(rhs)) => crate::Quaternion::eq(*lhs, *rhs), @@ -56,6 +80,22 @@ impl std::hash::Hash for Object { fn hash(&self, state: &mut H) { std::mem::discriminant(self).hash(state); match self { + Self::Undefined => {} + Self::Boolean(value) => value.hash(state), + Self::Integer(value) => value.hash(state), + Self::UInteger(value) => value.hash(state), + Self::Long(value) => value.hash(state), + Self::ULong(value) => value.hash(state), + Self::Real(value) => value.to_bits().hash(state), + Self::Date(value) => value.hash(state), + Self::Bytes(value) => value.hash(state), + Self::Uri(value) => value.hash(state), + Self::Array(value) => value.hash(state), + Self::Map(value) => { + let mut entries: Vec<_> = value.iter().collect(); + entries.sort_unstable_by_key(|(key, _)| *key); + entries.hash(state); + } Self::Color4(value) => value.get_hash_code().hash(state), Self::Matrix4(value) => value.get_hash_code().hash(state), Self::Quaternion(value) => value.get_hash_code().hash(state), diff --git a/tests/api-compile/Cargo.lock b/tests/api-compile/Cargo.lock index 3b77f42..539b097 100644 --- a/tests/api-compile/Cargo.lock +++ b/tests/api-compile/Cargo.lock @@ -243,6 +243,7 @@ dependencies = [ name = "libremetaverse-structured-data" version = "0.0.1" dependencies = [ + "base64", "libremetaverse-types", ] diff --git a/tests/compat/tests/types_structured_shims.rs b/tests/compat/tests/types_structured_shims.rs index 84ca112..07c733b 100644 --- a/tests/compat/tests/types_structured_shims.rs +++ b/tests/compat/tests/types_structured_shims.rs @@ -22,12 +22,9 @@ fn catalog_values_and_inert_layouts_are_real() { } #[test] -fn serializer_entry_point_returns_its_exact_member_id() { +fn parser_dispatch_rejects_empty_input_without_calling_a_decoder() { let Err(error) = OSDParser::deserialize_with_bytes(Vec::new()) else { - panic!("failure-only serializer unexpectedly returned a value"); + panic!("empty structured data unexpectedly returned a value"); }; - assert_eq!( - error.csharp_member(), - Some("M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.Byte[])") - ); + assert_eq!(error, libremetaverse_types::Error::Argument); } diff --git a/tests/red-suite-baseline.json b/tests/red-suite-baseline.json index 7856867..91630cb 100644 --- a/tests/red-suite-baseline.json +++ b/tests/red-suite-baseline.json @@ -20,5 +20,5 @@ "LibreMetaverse.Tests/TypeTests.cs::TypeTests.VectorCasting::test", "LibreMetaverse.Tests/UtilsConversionsTests.cs::UtilsConversionsTests.StringToBytes::test" ], - "support_passes": 62 + "support_passes": 73 } diff --git a/tools/generate_api_shims.py b/tools/generate_api_shims.py index ec6302f..5a75760 100644 --- a/tools/generate_api_shims.py +++ b/tools/generate_api_shims.py @@ -38,6 +38,21 @@ TARGETS = { # implementations. The generated module keeps catalog markers and re-exports # the hand-written type so coverage remains deterministic. NATIVE_TYPES = { + "T:LibreMetaverse.StructuredData.OSD": "crate::model::OSD", + "T:LibreMetaverse.StructuredData.OSDArray": "crate::model::OSDArray", + "T:LibreMetaverse.StructuredData.OSDBinary": "crate::model::OSDBinary", + "T:LibreMetaverse.StructuredData.OSDBoolean": "crate::model::OSDBoolean", + "T:LibreMetaverse.StructuredData.OSDDate": "crate::model::OSDDate", + "T:LibreMetaverse.StructuredData.OSDException": "crate::model::OSDException", + "T:LibreMetaverse.StructuredData.OSDFormat": "crate::model::OSDFormat", + "T:LibreMetaverse.StructuredData.OSDInteger": "crate::model::OSDInteger", + "T:LibreMetaverse.StructuredData.OSDLlsdXml": "crate::model::OSDLlsdXml", + "T:LibreMetaverse.StructuredData.OSDMap": "crate::model::OSDMap", + "T:LibreMetaverse.StructuredData.OSDReal": "crate::model::OSDReal", + "T:LibreMetaverse.StructuredData.OSDString": "crate::model::OSDString", + "T:LibreMetaverse.StructuredData.OSDType": "crate::model::OSDType", + "T:LibreMetaverse.StructuredData.OSDUUID": "crate::model::OSDUUID", + "T:LibreMetaverse.StructuredData.OSDUri": "crate::model::OSDUri", "T:LibreMetaverse.CacheDictionary`2": "crate::collections::CacheDictionary", "T:LibreMetaverse.CacheDictionary`2.CacheDictionaryEnumerator": "crate::collections::CacheDictionaryCacheDictionaryEnumerator", "T:LibreMetaverse.Color4": "crate::color4::Color4", @@ -64,6 +79,12 @@ NATIVE_TYPES = { } NATIVE_MEMBER_BODIES = { + "M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.Byte[])": + "crate::dispatch::deserialize_bytes(data)", + "M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.IO.Stream)": + "crate::dispatch::deserialize_stream(stream)", + "M:LibreMetaverse.StructuredData.OSDParser.Deserialize(System.String)": + "crate::dispatch::deserialize_string(data)", "M:LibreMetaverse.Utils.ReadSingleLittleEndian(System.Byte[],System.Int32)": "crate::byte_order::read_single_little_endian(src, pos)", "M:LibreMetaverse.Utils.WriteSingleLittleEndian(System.Byte[],System.Int32,System.Single)": diff --git a/tools/generate_rust_mapping.py b/tools/generate_rust_mapping.py index 6bd7543..912d467 100644 --- a/tools/generate_rust_mapping.py +++ b/tools/generate_rust_mapping.py @@ -189,6 +189,14 @@ MEMBER_TYPE_OVERRIDES = { ), } MEMBER_SIGNATURE_OVERRIDES = { + "M:LibreMetaverse.StructuredData.OSDArray.CopyTo(LibreMetaverse.StructuredData.OSD[],System.Int32)": ( + "pub fn copy_to(&self, array: &mut [libremetaverse_structured_data::OSD], index: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), + "M:LibreMetaverse.StructuredData.OSDMap.CopyTo(System.Collections.Generic.KeyValuePair{System.String,LibreMetaverse.StructuredData.OSD}[],System.Int32)": ( + "pub fn copy_to(&self, array: &mut [(String, libremetaverse_structured_data::OSD)], index: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), "M:LibreMetaverse.CacheDictionary`2.CopyTo(System.Collections.Generic.KeyValuePair{`0,`1}[],System.Int32)": ( "pub fn copy_to(&self, array: &mut [(TKey, Option)], array_index: i32) -> Result<(), crate::Error>", "shared_self,mutable_borrow,owned", @@ -972,6 +980,7 @@ def validate_generated_shims() -> None: "not_implemented(", "NotImplemented::new(", "crate::byte_order::", + "crate::dispatch::", ) ): raise ValueError(f"generated shim function does not use the standardized failure: {path.relative_to(ROOT)}")