Translate wire semantics tests
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -13,4 +13,4 @@ pub mod codec {
|
||||
mod generated;
|
||||
|
||||
pub use generated::*;
|
||||
pub use libremetaverse_types::NotImplemented as Error;
|
||||
pub use libremetaverse_types::Error;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user