use core::fmt;
use std::borrow::Cow;
pub trait Message: serde::Serialize + serde::de::DeserializeOwned {
const TYPE: &'static str;
const VERSION: u16;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct MessageType {
name: Cow<'static, str>,
version: u16,
}
impl MessageType {
#[must_use]
pub const fn new(name: &'static str, version: u16) -> Self {
Self {
name: Cow::Borrowed(name),
version,
}
}
pub fn from_parts(name: impl Into<Cow<'static, str>>, version: u16) -> Self {
Self {
name: name.into(),
version,
}
}
#[must_use]
pub fn of<T: Message>() -> Self {
Self::new(T::TYPE, T::VERSION)
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub const fn version(&self) -> u16 {
self.version
}
}
impl fmt::Display for MessageType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}.v{}", self.name, self.version)
}
}