use crate::__internal::SealedInternal;
use crate::{MutProxied, MutProxy, ViewProxy};
use create::Parse;
use interop::{MessageMutInterop, MessageViewInterop, OwnedMessageInterop};
use read::Serialize;
use std::fmt::Debug;
use write::{Clear, ClearAndParse, CopyFrom, MergeFrom, TakeFrom};
pub trait Message: SealedInternal
+ MutProxied
+ Parse + Default
+ Debug + Serialize
+ Clear + ClearAndParse + TakeFrom + CopyFrom + MergeFrom
+ Send + Sync
+ Clone
+ OwnedMessageInterop
{
}
pub trait MessageView<'msg>: SealedInternal
+ ViewProxy<'msg, Proxied = Self::Message>
+ Debug + Serialize + Default
+ Send + Sync
+ Copy + Clone
+ MessageViewInterop<'msg>
{
#[doc(hidden)]
type Message: Message;
}
pub trait MessageMut<'msg>: SealedInternal
+ MutProxy<'msg, MutProxied = Self::Message>
+ Debug + Serialize
+ Clear + ClearAndParse + TakeFrom + CopyFrom + MergeFrom
+ Sync
+ MessageMutInterop<'msg>
{
#[doc(hidden)]
type Message: Message;
}
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>);
}
}
pub(crate) mod interop {
use super::SealedInternal;
use std::ffi::c_void;
pub trait OwnedMessageInterop: SealedInternal {
#[cfg(cpp_kernel)]
fn __unstable_leak_raw_message(self) -> *mut c_void;
#[cfg(cpp_kernel)]
unsafe fn __unstable_take_ownership_of_raw_message(raw_message: *mut c_void) -> Self;
}
pub trait MessageViewInterop<'msg>: SealedInternal {
fn __unstable_as_raw_message(&self) -> *const c_void;
unsafe fn __unstable_wrap_raw_message(raw: &'msg *const c_void) -> Self;
unsafe fn __unstable_wrap_raw_message_unchecked_lifetime(raw: *const c_void) -> Self;
}
pub trait MessageMutInterop<'msg>: SealedInternal {
#[cfg(cpp_kernel)]
fn __unstable_as_raw_message_mut(&mut self) -> *mut c_void;
#[cfg(cpp_kernel)]
unsafe fn __unstable_wrap_raw_message_mut(raw: &'msg mut *mut c_void) -> Self;
#[cfg(cpp_kernel)]
unsafe fn __unstable_wrap_raw_message_mut_unchecked_lifetime(raw: *mut c_void) -> Self;
}
}