use super::*;
use crate::option::OptionIterator;
pub trait MessageRead {
fn msg_code(&self) -> MsgCode;
fn msg_type(&self) -> MsgType;
fn msg_id(&self) -> MsgId;
fn msg_token(&self) -> MsgToken;
fn payload(&self) -> &[u8];
fn options(&self) -> OptionIterator<'_>;
fn write_msg_to(&self, target: &mut dyn MessageWrite) -> Result<(), Error> {
target.set_msg_type(self.msg_type());
target.set_msg_code(self.msg_code());
let msg_id = self.msg_id();
if msg_id != 0 {
target.set_msg_id(self.msg_id());
}
target.set_msg_token(self.msg_token());
for opt in self.options() {
let opt = opt?;
target.insert_option_with_bytes(opt.0, opt.1)?;
}
target.append_payload_bytes(self.payload())?;
Ok(())
}
fn payload_as_str(&self) -> Option<&str> {
std::str::from_utf8(self.payload()).ok()
}
fn content_format(&self) -> Option<ContentFormat>;
fn accept(&self) -> Option<ContentFormat>;
fn block2(&self) -> Option<BlockInfo>;
fn block1(&self) -> Option<BlockInfo>;
}
impl<'a> ToOwned for dyn MessageRead + 'a {
type Owned = OwnedImmutableMessage;
fn to_owned(&self) -> Self::Owned {
let mut target = VecMessageEncoder::default();
self.write_msg_to(&mut target).unwrap();
target.into()
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct ResetMessage;
impl std::fmt::Display for ResetMessage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
MessageDisplay(self).fmt(f)
}
}
impl MessageRead for ResetMessage {
fn msg_code(&self) -> MsgCode {
MsgCode::Empty
}
fn msg_type(&self) -> MsgType {
MsgType::Res
}
fn msg_id(&self) -> u16 {
0
}
fn msg_token(&self) -> MsgToken {
Default::default()
}
fn payload(&self) -> &[u8] {
Default::default()
}
fn content_format(&self) -> Option<ContentFormat> {
None
}
fn accept(&self) -> Option<ContentFormat> {
None
}
fn block2(&self) -> Option<BlockInfo> {
None
}
fn block1(&self) -> Option<BlockInfo> {
None
}
fn options(&self) -> OptionIterator<'_> {
Default::default()
}
fn write_msg_to(&self, target: &mut dyn MessageWrite) -> Result<(), Error> {
target.set_msg_code(MsgCode::Empty);
target.set_msg_type(MsgType::Res);
target.set_msg_token(MsgToken::EMPTY);
Ok(())
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct AckMessage;
impl std::fmt::Display for AckMessage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
MessageDisplay(self).fmt(f)
}
}
impl MessageRead for AckMessage {
fn msg_code(&self) -> MsgCode {
MsgCode::Empty
}
fn msg_type(&self) -> MsgType {
MsgType::Ack
}
fn msg_id(&self) -> u16 {
0
}
fn msg_token(&self) -> MsgToken {
Default::default()
}
fn payload(&self) -> &[u8] {
Default::default()
}
fn content_format(&self) -> Option<ContentFormat> {
None
}
fn accept(&self) -> Option<ContentFormat> {
None
}
fn block2(&self) -> Option<BlockInfo> {
None
}
fn block1(&self) -> Option<BlockInfo> {
None
}
fn options(&self) -> OptionIterator<'_> {
Default::default()
}
fn write_msg_to(&self, target: &mut dyn MessageWrite) -> Result<(), Error> {
target.set_msg_code(MsgCode::Empty);
target.set_msg_type(MsgType::Ack);
target.set_msg_token(MsgToken::EMPTY);
Ok(())
}
}