Skip to main content

moq_transport/coding/
encode.rs

1use 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    // Helper function to make sure we have enough bytes to encode
9    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/// An encode error.
20#[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}