Translate wire semantics tests

This commit is contained in:
2026-08-08 18:00:11 +02:00
parent e656a4f6d2
commit de6e611ef0
32 changed files with 3488 additions and 1683 deletions

View File

@@ -11,4 +11,4 @@ mod generated;
pub use generated::*;
pub use libremetaverse_imaging as imaging;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -13,4 +13,4 @@ pub mod codec {
mod generated;
pub use generated::*;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -5,4 +5,4 @@ extern crate self as libremetaverse_lsl_tools;
mod generated;
pub use generated::*;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -6,4 +6,4 @@ mod generated;
pub use generated::*;
pub use libremetaverse_imaging as imaging;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -10,4 +10,4 @@ pub use libremetaverse_imaging as imaging;
pub use libremetaverse_prim_mesher as prim_mesher;
pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types as types;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -7,4 +7,4 @@ mod generated;
pub use generated::*;
pub use libremetaverse as core;
pub use libremetaverse_types as types;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -5,4 +5,4 @@ extern crate self as libremetaverse_rlv;
mod generated;
pub use generated::*;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -17,4 +17,4 @@ pub mod xml {
pub use generated::*;
pub use libremetaverse_types as types;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -7,5 +7,4 @@ mod generated;
pub mod shim;
pub use generated::*;
pub use shim::NotImplemented as Error;
pub use shim::{NotImplemented, not_implemented};
pub use shim::{Error, NotImplemented, not_implemented};

View File

@@ -1,6 +1,6 @@
//! Failure-only infrastructure for callable API shims.
//!
//! Fallible synchronous and asynchronous members return [`NotImplemented`].
//! Fallible synchronous and asynchronous members return [`Error::NotImplemented`].
//! Infallible members, trait methods, and constructors use
//! [`unimplemented_api!`](crate::unimplemented_api). Stream and callback
//! factories fail before returning a stream, registering a callback, or storing
@@ -42,13 +42,56 @@ impl fmt::Display for NotImplemented {
impl std::error::Error for NotImplemented {}
/// Shared error contract for translated fallible APIs.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum Error {
/// The API surface exists but its production body has not been ported yet.
NotImplemented(NotImplemented),
/// A required reference-like argument was absent.
ArgumentNull,
/// An argument value or length was invalid.
Argument,
/// An index or destination buffer boundary was exceeded.
IndexOutOfRange,
}
impl Error {
/// Returns the stable C# member ID for a failure-only shim.
#[must_use]
pub const fn csharp_member(self) -> Option<&'static str> {
match self {
Self::NotImplemented(error) => Some(error.csharp_member()),
Self::ArgumentNull | Self::Argument | Self::IndexOutOfRange => None,
}
}
}
impl From<NotImplemented> for Error {
fn from(error: NotImplemented) -> Self {
Self::NotImplemented(error)
}
}
impl fmt::Display for Error {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NotImplemented(error) => error.fmt(formatter),
Self::ArgumentNull => formatter.write_str("required argument was null"),
Self::Argument => formatter.write_str("argument was invalid"),
Self::IndexOutOfRange => formatter.write_str("index was out of range"),
}
}
}
impl std::error::Error for Error {}
/// Returns the standardized typed failure without constructing a fake value.
///
/// # Errors
///
/// Always returns [`NotImplemented`] with the supplied stable C# member ID.
pub const fn not_implemented<T>(csharp_member: &'static str) -> Result<T, NotImplemented> {
Err(NotImplemented::new(csharp_member))
/// Always returns [`Error::NotImplemented`] with the supplied stable C# member ID.
pub const fn not_implemented<T>(csharp_member: &'static str) -> Result<T, Error> {
Err(Error::NotImplemented(NotImplemented::new(csharp_member)))
}
/// Panics for an infallible API whose signature cannot return [`NotImplemented`].
@@ -79,7 +122,7 @@ macro_rules! unimplemented_api {
#[cfg(test)]
mod tests {
use super::{NotImplemented, PANIC_PREFIX, not_implemented};
use super::{Error, NotImplemented, PANIC_PREFIX, not_implemented};
const MEMBER: &str = "M:LibreMetaverse.GridClient.Login(System.String)";
@@ -91,7 +134,10 @@ mod tests {
error.to_string(),
format!("C# API member {MEMBER} is not implemented")
);
assert_eq!(not_implemented::<bool>(MEMBER), Err(error));
assert_eq!(
not_implemented::<bool>(MEMBER),
Err(Error::NotImplemented(error))
);
}
#[test]

View File

@@ -8,4 +8,4 @@ pub use generated::*;
pub use libremetaverse as core;
pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types as types;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -8,4 +8,4 @@ pub use generated::*;
pub use libremetaverse as core;
pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types as types;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;

View File

@@ -7,7 +7,7 @@ mod generated;
pub use generated::*;
pub use libremetaverse as core;
pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;
/// Project-owned boundary types for external JSON signatures.
pub mod signaling {

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ pub use generated::*;
pub use libremetaverse_imaging as imaging_abstractions;
pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types as types;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;
/// Project-owned boundary types for external `MessagePack` signatures.
pub mod message_pack {