use super::*;
pub trait MessageWrite: OptionInsert {
fn set_msg_type(&mut self, tt: MsgType);
fn set_msg_id(&mut self, msg_id: MsgId);
fn set_msg_code(&mut self, code: MsgCode);
fn set_msg_token(&mut self, token: MsgToken);
fn append_payload_bytes(&mut self, body: &[u8]) -> Result<(), Error>;
fn append_payload_string(&mut self, body: &str) -> Result<(), Error> {
self.append_payload_bytes(body.as_bytes())
}
fn append_payload_u8(&mut self, b: u8) -> Result<(), Error> {
self.append_payload_bytes(&[b])
}
fn append_payload_char(&mut self, c: char) -> Result<(), Error> {
self.append_payload_string(c.encode_utf8(&mut [0; 4]))
}
fn clear(&mut self);
}
impl<'a> core::fmt::Write for dyn MessageWrite + 'a {
fn write_str(&mut self, s: &str) -> Result<(), core::fmt::Error> {
self.append_payload_string(s)?;
Ok(())
}
fn write_char(&mut self, c: char) -> Result<(), core::fmt::Error> {
self.append_payload_char(c)?;
Ok(())
}
}
impl<'a> std::io::Write for dyn MessageWrite + 'a {
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
self.append_payload_bytes(buf)
.map(|_| buf.len())
.map_err(|_| std::io::ErrorKind::Other.into())
}
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
fn write_all(&mut self, buf: &[u8]) -> Result<(), std::io::Error> {
self.append_payload_bytes(buf)
.map_err(|_| std::io::ErrorKind::Other.into())
}
}
impl<'a> std::io::Write for BufferMessageEncoder<'a> {
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
self.append_payload_bytes(buf)
.map(|_| buf.len())
.map_err(|_| std::io::ErrorKind::Other.into())
}
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
fn write_all(&mut self, buf: &[u8]) -> Result<(), std::io::Error> {
self.append_payload_bytes(buf)
.map_err(|_| std::io::ErrorKind::Other.into())
}
}
impl std::io::Write for VecMessageEncoder {
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
self.append_payload_bytes(buf)
.map(|_| buf.len())
.map_err(|_| std::io::ErrorKind::Other.into())
}
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
fn write_all(&mut self, buf: &[u8]) -> Result<(), std::io::Error> {
self.append_payload_bytes(buf)
.map_err(|_| std::io::ErrorKind::Other.into())
}
}