pub trait MessageOption {
fn number(&self) -> u16;
#[doc(alias = "opaque")]
fn value(&self) -> &[u8];
#[doc(alias = "string")]
fn value_str(&self) -> Option<&str> {
core::str::from_utf8(self.value()).ok()
}
#[doc(alias = "uint")]
fn value_uint<U>(&self) -> Option<U>
where
U: num_traits::sign::Unsigned + num_traits::ops::bytes::FromBytes,
U::Bytes: Sized + Default,
{
let mut bufarray: U::Bytes = Default::default();
let buf = bufarray.as_mut();
let buflen = buf.len();
let val = self.value();
if val.len() > buflen {
return None;
}
buf[buflen - val.len()..].copy_from_slice(val);
Some(U::from_be_bytes(&bufarray))
}
}
pub trait WithSortedOptions: ReadableMessage {}
pub trait ReadableMessage {
type Code: crate::numbers::Code;
type MessageOption<'a>: MessageOption
where
Self: 'a;
type OptionsIter<'a>: Iterator<Item = Self::MessageOption<'a>>
where
Self: 'a;
fn code(&self) -> Self::Code;
fn options(&self) -> Self::OptionsIter<'_>;
fn payload(&self) -> &[u8];
fn with_static_type_annotation(&self) -> Option<crate::helpers::RefWithStaticType<'_, Self>> {
None
}
}
pub trait MinimalWritableMessage {
type Code: crate::numbers::Code;
type OptionNumber: crate::numbers::OptionNumber;
type AddOptionError: crate::error::RenderableOnMinimal + core::fmt::Debug;
type SetPayloadError: crate::error::RenderableOnMinimal + core::fmt::Debug;
type UnionError: crate::error::RenderableOnMinimal
+ core::fmt::Debug
+ From<Self::AddOptionError>
+ From<Self::SetPayloadError>
+ From<<Self::Code as crate::numbers::Code>::Error>
+ From<<Self::OptionNumber as crate::numbers::OptionNumber>::Error>;
fn set_code(&mut self, code: Self::Code);
fn add_option(
&mut self,
number: Self::OptionNumber,
value: &[u8],
) -> Result<(), Self::AddOptionError>;
fn set_payload(&mut self, data: &[u8]) -> Result<(), Self::SetPayloadError>;
fn set_from_message<M>(&mut self, msg: &M) -> Result<(), Self::UnionError>
where
M: ReadableMessage + WithSortedOptions,
{
use crate::numbers::{Code, OptionNumber};
self.set_code(Self::Code::new(msg.code().into())?);
for opt in msg.options() {
self.add_option(Self::OptionNumber::new(opt.number())?, opt.value())?;
}
self.set_payload(msg.payload())?;
Ok(())
}
fn add_option_str(
&mut self,
number: Self::OptionNumber,
value: &str,
) -> Result<(), Self::AddOptionError> {
self.add_option(number, value.as_bytes())
}
fn add_option_uint<U: num_traits::sign::Unsigned + num_traits::ops::bytes::ToBytes>(
&mut self,
number: Self::OptionNumber,
value: U,
) -> Result<(), Self::AddOptionError> {
let value = value.to_be_bytes();
let mut value = value.as_ref();
while let Some(&0) = value.first() {
value = &value[1..];
}
self.add_option(number, value)
}
fn with_static_type_annotation(
&mut self,
) -> Option<crate::helpers::RefMutWithStaticType<'_, Self>> {
None
}
#[inline]
fn promote_to_mutable_writable_message(
&mut self,
) -> Option<
&mut (impl MinimalWritableMessage<
Code = Self::Code,
OptionNumber = Self::OptionNumber,
AddOptionError = Self::AddOptionError,
SetPayloadError = Self::SetPayloadError,
UnionError = Self::UnionError,
> + MutableWritableMessage),
> {
None::<
&mut ImpossibleMessage<
Self::Code,
Self::OptionNumber,
Self::AddOptionError,
Self::SetPayloadError,
Self::UnionError,
>,
>
}
fn convert_code_error(e: <Self::Code as crate::numbers::Code>::Error) -> Self::UnionError {
Self::UnionError::from(e)
}
fn convert_option_number_error(
e: <Self::OptionNumber as crate::numbers::OptionNumber>::Error,
) -> Self::UnionError {
Self::UnionError::from(e)
}
fn convert_add_option_error(e: Self::AddOptionError) -> Self::UnionError {
Self::UnionError::from(e)
}
fn convert_set_payload_error(e: Self::SetPayloadError) -> Self::UnionError {
Self::UnionError::from(e)
}
}
pub trait MutableWritableMessage: MinimalWritableMessage {
fn available_space(&self) -> usize;
fn payload_mut_with_len(&mut self, len: usize) -> Result<&mut [u8], Self::SetPayloadError>;
fn truncate(&mut self, len: usize) -> Result<(), Self::SetPayloadError>;
fn mutate_options<F>(&mut self, callback: F)
where
F: FnMut(Self::OptionNumber, &mut [u8]);
}
struct ImpossibleMessage<Code, OptionNumber, AddOptionError, SetPayloadError, UnionError> {
_phantom: core::marker::PhantomData<(
Code,
OptionNumber,
AddOptionError,
SetPayloadError,
UnionError,
)>,
_never: core::convert::Infallible,
}
impl<
Code: TryFrom<u8> + crate::numbers::Code + Into<u8>,
OptionNumber: TryFrom<u16> + crate::numbers::OptionNumber + Into<u16>,
AddOptionError: core::fmt::Debug + crate::error::RenderableOnMinimal,
SetPayloadError: core::fmt::Debug + crate::error::RenderableOnMinimal,
UnionError: core::fmt::Debug
+ crate::error::RenderableOnMinimal
+ core::convert::From<AddOptionError>
+ core::convert::From<SetPayloadError>
+ From<<Code as crate::numbers::Code>::Error>
+ From<<OptionNumber as crate::numbers::OptionNumber>::Error>,
> MinimalWritableMessage
for ImpossibleMessage<Code, OptionNumber, AddOptionError, SetPayloadError, UnionError>
{
type Code = Code;
type OptionNumber = OptionNumber;
type AddOptionError = AddOptionError;
type SetPayloadError = SetPayloadError;
type UnionError = UnionError;
fn set_code(&mut self, _code: Self::Code) {
match self._never {}
}
fn add_option(
&mut self,
_number: Self::OptionNumber,
_value: &[u8],
) -> Result<(), Self::AddOptionError> {
match self._never {}
}
fn set_payload(&mut self, _data: &[u8]) -> Result<(), Self::SetPayloadError> {
match self._never {}
}
}
impl<
Code: TryFrom<u8> + crate::numbers::Code + Into<u8>,
OptionNumber: TryFrom<u16> + crate::numbers::OptionNumber + Into<u16>,
AddOptionError: core::fmt::Debug + crate::error::RenderableOnMinimal,
SetPayloadError: core::fmt::Debug + crate::error::RenderableOnMinimal,
UnionError: core::fmt::Debug
+ crate::error::RenderableOnMinimal
+ core::convert::From<AddOptionError>
+ core::convert::From<SetPayloadError>
+ From<<Code as crate::numbers::Code>::Error>
+ From<<OptionNumber as crate::numbers::OptionNumber>::Error>,
> MutableWritableMessage
for ImpossibleMessage<Code, OptionNumber, AddOptionError, SetPayloadError, UnionError>
{
fn available_space(&self) -> usize {
match self._never {}
}
fn payload_mut_with_len(&mut self, _len: usize) -> Result<&mut [u8], Self::SetPayloadError> {
match self._never {}
}
fn truncate(&mut self, _len: usize) -> Result<(), Self::SetPayloadError> {
match self._never {}
}
fn mutate_options<F>(&mut self, _callback: F)
where
F: FnMut(Self::OptionNumber, &mut [u8]),
{
match self._never {}
}
}
pub trait SeekWritableMessage {
}