use crate::ValueCodecDescriptor;
use crate::ValueCodecId;
use crate::ValueCodecRegistrationSource;
#[derive(Clone, Copy, Debug)]
pub struct ValueCodecRegistration {
id: ValueCodecId,
descriptor: &'static ValueCodecDescriptor,
source: ValueCodecRegistrationSource,
}
impl ValueCodecRegistration {
#[doc(hidden)]
#[must_use]
pub const fn new(
id: ValueCodecId,
descriptor: &'static ValueCodecDescriptor,
source: ValueCodecRegistrationSource,
) -> Self {
Self { id, descriptor, source }
}
#[must_use]
pub const fn id(&self) -> ValueCodecId {
self.id
}
#[must_use]
pub const fn descriptor(&self) -> &'static ValueCodecDescriptor {
self.descriptor
}
#[must_use]
pub const fn source(&self) -> ValueCodecRegistrationSource {
self.source
}
}
#[macro_export]
macro_rules! register_value_codec {
(id = $id:literal, codec = $codec:ty, value = $value:ty $(,)?) => {
const _: () = {
static DESCRIPTOR: $crate::ValueCodecDescriptor = $crate::ValueCodecDescriptor::of::<$codec, $value>();
fn registration() -> $crate::ValueCodecRegistration {
$crate::ValueCodecRegistration::new(
$crate::ValueCodecId::new($id),
&DESCRIPTOR,
$crate::ValueCodecRegistrationSource::new(env!("CARGO_PKG_NAME"), module_path!(), file!(), line!()),
)
}
$crate::__private::inventory::submit! {
$crate::ValueCodecRegistrationFactory(registration)
}
};
};
}