#[cfg(feature = "serde")]
#[doc(hidden)]
pub use {erased_serde, serde};
#[doc(hidden)]
pub use alloc::boxed::Box;
#[macro_export]
macro_rules! declare_object_trait {
($(#[$meta:meta])* $vis:vis trait $Name:ident, $what:literal) => {
$(#[$meta])*
#[cfg(not(feature = "serde"))]
$vis trait $Name: ::core::fmt::Debug + ::core::any::Any + Send + Sync {
fn as_any(&self) -> &dyn ::core::any::Any;
}
$(#[$meta])*
#[cfg(feature = "serde")]
$vis trait $Name:
::core::fmt::Debug
+ ::core::any::Any
+ Send
+ Sync
+ $crate::erased::erased_serde::Serialize
{
fn as_any(&self) -> &dyn ::core::any::Any;
}
#[cfg(not(feature = "serde"))]
impl<T> $Name for T
where
T: ::core::fmt::Debug + ::core::any::Any + Send + Sync,
{
fn as_any(&self) -> &dyn ::core::any::Any {
self
}
}
#[cfg(feature = "serde")]
impl<T> $Name for T
where
T: ::core::fmt::Debug
+ ::core::any::Any
+ Send
+ Sync
+ $crate::erased::serde::Serialize,
{
fn as_any(&self) -> &dyn ::core::any::Any {
self
}
}
impl dyn $Name {
#[doc = concat!("Downcast a registered ", $what, " to its concrete type `T`.")]
#[must_use]
pub fn downcast_ref<T: ::core::any::Any>(&self) -> Option<&T> {
self.as_any().downcast_ref::<T>()
}
#[doc = concat!("`true` if the registered ", $what, "'s concrete type is `T`.")]
#[must_use]
pub fn is<T: ::core::any::Any>(&self) -> bool {
self.as_any().is::<T>()
}
}
#[cfg(feature = "serde")]
pub(crate) fn serialize_erased<S: $crate::erased::serde::Serializer>(
v: &$crate::erased::Box<dyn $Name>,
s: S,
) -> ::core::result::Result<S::Ok, S::Error> {
$crate::erased::erased_serde::serialize(&**v, s)
}
};
}