moq_transport/coding/
encode.rs1use std::{io, sync};
2
3use super::BoundsExceeded;
4
5pub trait Encode: Sized {
6 fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError>;
7
8 fn encode_remaining<W: bytes::BufMut>(buf: &mut W, required: usize) -> Result<(), EncodeError> {
10 let needed = required.saturating_sub(buf.remaining_mut());
11 if needed > 0 {
12 Err(EncodeError::More(needed))
13 } else {
14 Ok(())
15 }
16 }
17}
18
19#[derive(thiserror::Error, Debug, Clone)]
21pub enum EncodeError {
22 #[error("short buffer")]
23 More(usize),
24
25 #[error("varint too large")]
26 BoundsExceeded(#[from] BoundsExceeded),
27
28 #[error("invalid value")]
29 InvalidValue,
30
31 #[error("field '{0}' missing")]
32 MissingField(String),
33
34 #[error("i/o error: {0}")]
35 Io(sync::Arc<io::Error>),
36
37 #[error("message too large")]
38 MsgBoundsExceeded,
39
40 #[error("field '{0}' too large")]
41 FieldBoundsExceeded(String),
42}
43
44impl From<io::Error> for EncodeError {
45 fn from(err: io::Error) -> Self {
46 Self::Io(sync::Arc::new(err))
47 }
48}