use crate::__internal::runtime::{
KernelMessage, KernelMessageMut, KernelMessageView, MessageMutInterop, MessageViewInterop,
OwnedMessageInterop,
};
use crate::__internal::SealedInternal;
use crate::AsMut;
use crate::AsView;
use crate::IntoMut;
use crate::IntoView;
use crate::MutProxied;
use crate::{ProtoBytes, ProtoString};
use create::Parse;
use read::Serialize;
use std::fmt::Debug;
use write::{Clear, ClearAndParse, CopyFrom, MergeFrom, TakeFrom};
pub(crate) trait MessageTypeHelper<T> {}
impl<T: EntityType<Tag = entity_tag::MessageTag>> MessageTypeHelper<entity_tag::MessageTag> for T {}
pub trait MessageType {}
impl<T> MessageType for T where T: EntityType + MessageTypeHelper<T::Tag> {}
pub trait Message: SealedInternal
+ EntityType<Tag = entity_tag::MessageTag>
+ MessageType
+ MutProxied
+ for<'a> MutProxied<View<'a> = Self::MessageView<'a>, Mut<'a> = Self::MessageMut<'a>>
+ Parse + Default
+ Debug + Serialize
+ Clear + ClearAndParse + TakeFrom + CopyFrom + MergeFrom
+ Send + Sync
+ Clone
+ OwnedMessageInterop
+ KernelMessage
{
type MessageView<'msg>: MessageView<'msg, Message = Self>;
type MessageMut<'msg>: MessageMut<'msg, Message = Self>;
}
pub trait MessageView<'msg>: SealedInternal
+ AsView<Proxied = Self::Message>
+ IntoView<'msg, Proxied = Self::Message>
+ EntityType<Tag = entity_tag::ViewProxyTag>
+ Debug + Serialize + Default
+ Send + Sync
+ Copy + Clone
+ MessageViewInterop<'msg>
+ KernelMessageView<'msg, KMessage = Self::Message>
{
#[doc(hidden)]
type Message: Message;
}
pub trait MessageMut<'msg>: SealedInternal
+ AsView<Proxied = Self::Message>
+ IntoView<'msg, Proxied = Self::Message>
+ AsMut<MutProxied = Self::Message>
+ IntoMut<'msg, MutProxied = Self::Message>
+ Debug + Serialize
+ Clear + ClearAndParse + TakeFrom + CopyFrom + MergeFrom
+ Send + Sync
+ MessageMutInterop<'msg>
+ KernelMessageMut<'msg, KMessage = Self::Message>
{
#[doc(hidden)]
type Message: Message;
}
pub trait EntityType {
type Tag;
}
pub mod entity_tag {
pub struct MessageTag;
pub struct EnumTag;
pub struct PrimitiveTag;
pub struct ViewProxyTag;
pub struct MutProxyTag;
pub struct RepeatedTag;
}
macro_rules! impl_entity_type_for_primitives {
($($t:ty,)*) => {
$(
impl EntityType for $t {
type Tag = entity_tag::PrimitiveTag;
}
)*
};
}
impl_entity_type_for_primitives!(f32, f64, i32, u32, i64, u64, bool, ProtoBytes, ProtoString,);
pub(crate) mod create {
use super::SealedInternal;
pub trait Parse: SealedInternal + Sized {
fn parse(serialized: &[u8]) -> Result<Self, crate::ParseError>;
fn parse_dont_enforce_required(serialized: &[u8]) -> Result<Self, crate::ParseError>;
}
impl<T> Parse for T
where
Self: Default + crate::ClearAndParse,
{
fn parse(serialized: &[u8]) -> Result<Self, crate::ParseError> {
let mut msg = Self::default();
crate::ClearAndParse::clear_and_parse(&mut msg, serialized).map(|_| msg)
}
fn parse_dont_enforce_required(serialized: &[u8]) -> Result<Self, crate::ParseError> {
let mut msg = Self::default();
crate::ClearAndParse::clear_and_parse_dont_enforce_required(&mut msg, serialized)
.map(|_| msg)
}
}
}
pub(crate) mod read {
use super::SealedInternal;
pub trait Serialize: SealedInternal {
fn serialize(&self) -> Result<Vec<u8>, crate::SerializeError>;
}
}
pub(crate) mod write {
use super::SealedInternal;
use crate::{AsMut, AsView};
pub trait Clear: SealedInternal {
fn clear(&mut self);
}
pub trait ClearAndParse: SealedInternal {
fn clear_and_parse(&mut self, data: &[u8]) -> Result<(), crate::ParseError>;
fn clear_and_parse_dont_enforce_required(
&mut self,
data: &[u8],
) -> Result<(), crate::ParseError>;
}
pub trait CopyFrom: AsView + SealedInternal {
fn copy_from(&mut self, src: impl AsView<Proxied = Self::Proxied>);
}
pub trait TakeFrom: AsView + SealedInternal {
fn take_from(&mut self, src: impl AsMut<MutProxied = Self::Proxied>);
}
pub trait MergeFrom: AsView + SealedInternal {
fn merge_from(&mut self, src: impl AsView<Proxied = Self::Proxied>);
}
}