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: crate::numtraits::Ux>(&self) -> Option<U> {
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 payload(&self) -> &[u8];
fn options(&self) -> Self::OptionsIter<'_>;
}
pub trait MinimalWritableMessage {
type Code: crate::numbers::Code;
type OptionNumber: crate::numbers::OptionNumber;
fn set_code(&mut self, code: Self::Code);
fn add_option(&mut self, number: Self::OptionNumber, value: &[u8]);
fn set_payload(&mut self, data: &[u8]);
fn set_from_message<M>(&mut self, msg: &M)
where
M: ReadableMessage,
{
use core::convert::TryInto;
self.set_code(
msg.code()
.into()
.try_into()
.map_err(|_| "Code can not be expressed in target message")
.unwrap(),
);
for opt in msg.options() {
self.add_option(
opt.number()
.try_into()
.map_err(|_| "Option can not be expressed in target message")
.unwrap(),
opt.value(),
)
}
self.set_payload(msg.payload());
}
fn add_option_str(&mut self, number: Self::OptionNumber, value: &str) {
self.add_option(number, value.as_bytes())
}
fn add_option_uint<U: crate::numtraits::Ux>(&mut self, number: Self::OptionNumber, value: U) {
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)
}
}
pub trait MutableWritableMessage: MinimalWritableMessage {
fn available_space(&self) -> usize;
#[deprecated(since = "0.1.1", note = "Use payload_mut_with_len instead")]
fn payload_mut(&mut self) -> &mut [u8];
#[allow(deprecated)] fn payload_mut_with_len(&mut self, len: usize) -> &mut [u8] {
&mut self.payload_mut()[..len]
}
fn truncate(&mut self, len: usize);
fn mutate_options<F>(&mut self, callback: F)
where
F: FnMut(Self::OptionNumber, &mut [u8]);
}
pub trait SeekWritableMessage {
}