use crate::plugin::exported_tables::ref_shared::{new_shared_ref, RefShared};
use anyhow::Error;
use std::ffi::CStr;
pub trait Metadata: Sized {
fn new() -> Result<Self, anyhow::Error>;
}
impl Metadata for () {
fn new() -> Result<Self, Error> {
Ok(())
}
}
impl<M: Metadata> Metadata for RefShared<M> {
fn new() -> Result<Self, anyhow::Error> {
Ok(new_shared_ref(M::new()?))
}
}
pub trait HasMetadata: Sized {
type Metadata;
fn new_with_metadata(tag: &'static CStr, meta: &Self::Metadata) -> Result<Self, Error>;
}
impl<T: HasMetadata> HasMetadata for RefShared<T> {
type Metadata = T::Metadata;
fn new_with_metadata(tag: &'static CStr, meta: &Self::Metadata) -> Result<Self, Error> {
Ok(new_shared_ref(T::new_with_metadata(tag, meta)?))
}
}