// #[macro_export] macro_rules! newtype { ($name:ident, $docs:literal) => { #[doc = $docs] #[derive( Clone, Copy, Default, Debug, derive_more::Display, derive_more::From, PartialEq, Eq, PartialOrd, Ord, Hash, derive_more::AsRef, derive_more::Constructor, serde::Serialize, serde::Deserialize, )] pub struct $name; }; ($name:ident, $type:ty $(, $derive:ty)*, $docs:literal) => { #[doc = $docs] #[derive( Clone, Debug, derive_more::From, PartialEq, Eq, derive_more::AsRef, derive_more::Deref, serde::Serialize, serde::Deserialize, $($derive),* )] pub struct $name($type); impl $name { pub fn new(value: impl Into<$type>) -> Self { Self(value.into()) } #[allow(clippy::missing_const_for_fn)] #[must_use] pub fn peel(self) -> $type { self.0 } } impl From<$name> for $type { fn from(value: $name) -> $type { value.peel() } } }; }