moq_transport/coding/
decode.rs1use 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 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#[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 #[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}