use crate::TypedMetadata;
use crate::ptr_metadata::*;
use std::any::TypeId;
pub struct Meta {
pub(crate) meta_raw: usize,
pub(crate) data_id: TypeId,
pub(crate) meta_id: TypeId,
}
impl Meta {
pub fn try_from<Data, RequestedType>(
data: &Data,
requested_type_id: TypeId,
cast_fn: fn(&Data) -> &RequestedType,
) -> Option<Meta>
where
Data: 'static,
RequestedType: Pointee + ?Sized + 'static,
RequestedType::Metadata: TypedMetadata,
{
if requested_type_id != TypeId::of::<RequestedType>() {
return None;
}
let dyn_trait = cast_fn(data);
let typed_meta = metadata(dyn_trait);
RequestedType::Metadata::into_meta::<Data>(typed_meta).into()
}
pub fn into_metadata<Data, RequestedType>(self) -> RequestedType::Metadata
where
Data: 'static,
RequestedType: Pointee + ?Sized + 'static,
RequestedType::Metadata: TypedMetadata,
{
assert_eq!(self.data_id, TypeId::of::<Data>(), "Wrong Data type");
RequestedType::Metadata::from_meta(self)
}
}