mcproto_rs/
deserialize.rs1use 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}