mcproto_rs/
deserialize.rs

1use crate::types::VarInt;
2use alloc::{vec::Vec, string::{FromUtf8Error, String}, fmt};
3
4pub enum DeserializeErr {
5    Eof,
6    VarNumTooLong(Vec<u8>),
7    NegativeLength(VarInt),
8    BadStringEncoding(FromUtf8Error),
9    InvalidBool(u8),
10    NbtUnknownTagType(u8),
11    NbtBadLength(isize),
12    NbtInvalidStartTag(u8),
13    CannotUnderstandValue(String),
14    FailedJsonDeserialize(String),
15}
16
17impl fmt::Display for DeserializeErr {
18    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19        use DeserializeErr::*;
20        match self {
21            Eof => f.write_str("unexpected eof"),
22            VarNumTooLong(data) => {
23                f.write_fmt(format_args!("var num is too long: data={:?}", data))
24            }
25            NegativeLength(data) => {
26                f.write_fmt(format_args!("negative length encountered {:?}", data))
27            }
28            BadStringEncoding(data) => f.write_fmt(format_args!(
29                "failed to decode string, utf error: {:?}",
30                data
31            )),
32            InvalidBool(value) => f.write_fmt(format_args!(
33                "could not decode boolean, unexpected byte: {:?}",
34                value
35            )),
36            NbtUnknownTagType(data) => f.write_fmt(format_args!("nbt: bad tag type {}", data)),
37            NbtBadLength(data) => f.write_fmt(format_args!("nbt: bad length {:?}", data)),
38            NbtInvalidStartTag(data) => {
39                f.write_fmt(format_args!("nbt: unexpected start tag id: {:?}", data))
40            }
41            CannotUnderstandValue(data) => {
42                f.write_fmt(format_args!("cannot understand value: {:?}", data))
43            }
44            FailedJsonDeserialize(data) => {
45                f.write_fmt(format_args!("failed to deserialize json: {:?}", data))
46            }
47        }
48    }
49}
50impl fmt::Debug for DeserializeErr {
51    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52        <dyn fmt::Display>::fmt(self, f)
53    }
54}
55
56#[cfg(feature = "std")]
57impl std::error::Error for DeserializeErr {}
58
59impl<'b, R> Into<DeserializeResult<'b, R>> for DeserializeErr {
60    fn into(self) -> DeserializeResult<'b, R> {
61        Err(self)
62    }
63}
64
65pub struct Deserialized<'b, R> {
66    pub value: R,
67    pub data: &'b [u8],
68}
69
70impl<'b, R> Into<DeserializeResult<'b, R>> for Deserialized<'b, R> {
71    fn into(self) -> DeserializeResult<'b, R> {
72        Ok(self)
73    }
74}
75
76impl<'b, R> Deserialized<'b, R> {
77    pub fn create(value: R, data: &'b [u8]) -> Self {
78        Deserialized { value, data }
79    }
80
81    pub fn ok(value: R, rest: &'b [u8]) -> DeserializeResult<'b, R> {
82        Self::create(value, rest).into()
83    }
84
85    pub fn replace<T>(self, other: T) -> Deserialized<'b, T> {
86        Deserialized {
87            value: other,
88            data: self.data,
89        }
90    }
91
92    pub fn map<F, T>(self, f: F) -> Deserialized<'b, T>
93    where
94        F: FnOnce(R) -> T,
95    {
96        Deserialized {
97            value: f(self.value),
98            data: self.data,
99        }
100    }
101
102    pub fn try_map<F, T>(self, f: F) -> DeserializeResult<'b, T>
103    where
104        F: FnOnce(R) -> Result<T, DeserializeErr>,
105    {
106        match f(self.value) {
107            Ok(new_value) => Ok(Deserialized {
108                value: new_value,
109                data: self.data,
110            }),
111            Err(err) => Err(err),
112        }
113    }
114
115    pub fn and_then<F, T>(self, f: F) -> DeserializeResult<'b, T>
116    where
117        F: FnOnce(R, &'b [u8]) -> DeserializeResult<'b, T>,
118    {
119        f(self.value, self.data)
120    }
121}
122
123impl<'b, R> From<(R, &'b [u8])> for Deserialized<'b, R> {
124    fn from(v: (R, &'b [u8])) -> Self {
125        let (value, data) = v;
126        Deserialized { value, data }
127    }
128}
129
130pub type DeserializeResult<'b, R> = Result<Deserialized<'b, R>, DeserializeErr>;
131
132pub trait Deserialize: Sized {
133    fn mc_deserialize(data: &[u8]) -> DeserializeResult<Self>;
134}