Skip to main content

moq_transport/coding/
decode.rs

1use super::BoundsExceeded;
2use std::{io, string::FromUtf8Error, sync};
3use thiserror::Error;
4
5pub trait Decode: Sized {
6    fn decode<B: bytes::Buf>(buf: &mut B) -> Result<Self, DecodeError>;
7
8    // Helper function to make sure we have enough bytes to decode
9    fn decode_remaining<B: bytes::Buf>(buf: &mut B, required: usize) -> Result<(), DecodeError> {
10        let needed = required.saturating_sub(buf.remaining());
11        if needed > 0 {
12            Err(DecodeError::More(needed))
13        } else {
14            Ok(())
15        }
16    }
17}
18
19/// A decode error.
20#[derive(Error, Debug, Clone)]
21pub enum DecodeError {
22    #[error("fill buffer")]
23    More(usize),
24
25    #[error("invalid payload length {0} got {1}")]
26    InvalidLength(usize, usize),
27
28    #[error("invalid string")]
29    InvalidString(#[from] FromUtf8Error),
30
31    #[error("invalid message: {0:?}")]
32    InvalidMessage(u64),
33
34    #[error("invalid subscribe location")]
35    InvalidSubscribeLocation,
36
37    #[error("invalid filter type")]
38    InvalidFilterType,
39
40    #[error("invalid fetch type")]
41    InvalidFetchType,
42
43    #[error("invalid group order")]
44    InvalidGroupOrder,
45
46    #[error("invalid object status")]
47    InvalidObjectStatus,
48
49    #[error("invalid header type")]
50    InvalidHeaderType,
51
52    #[error("invalid value")]
53    InvalidValue,
54
55    #[error("varint bounds exceeded")]
56    BoundsExceeded(#[from] BoundsExceeded),
57
58    // TODO move these to ParamError
59    #[error("duplicate parameter: {0:?}")]
60    DuplicateParameter(u64),
61
62    #[error("missing parameter")]
63    MissingParameter,
64
65    #[error("invalid parameter")]
66    InvalidParameter,
67
68    #[error("io error: {0}")]
69    Io(sync::Arc<io::Error>),
70
71    #[error("key-value-pair length exceeded")]
72    KeyValuePairLengthExceeded(),
73
74    #[error("field '{0}' too large")]
75    FieldBoundsExceeded(String),
76
77    #[error("invalid datagram type")]
78    InvalidDatagramType,
79}
80
81impl From<io::Error> for DecodeError {
82    fn from(err: io::Error) -> Self {
83        Self::Io(sync::Arc::new(err))
84    }
85}