minint/datatype/
bsint.rs

1use rmp::{decode::RmpRead, encode::RmpWrite, Marker};
2
3use crate::NtError;
4
5use super::DataType;
6
7#[derive(Clone, Debug)]
8pub enum BsInt {
9    I8(i8),
10    I16(i16),
11    I32(i32),
12    I64(i64),
13    U8(u8),
14    U16(u16),
15    U32(u32),
16    U64(u64),
17}
18impl DataType for BsInt {
19    const DATATYPE_MSGPCK: u8 = 2;
20    const ARRAYDATATYPE_MSGPCK: u8 = 18;
21    const DATATYPE_STRING: &'static str = "int";
22    const ARRAYDATATYPE_STRING: &'static str = "int[]";
23
24    fn decode<R: RmpRead>(rd: &mut R) -> Result<Self, ()> {
25        let marker = rmp::decode::read_marker(rd).map_err(|_| ())?;
26        match marker {
27            Marker::I8 => Ok(BsInt::I8(rmp::decode::read_i8(rd).map_err(|_| ())?)),
28            Marker::I16 => Ok(BsInt::I16(rmp::decode::read_i16(rd).map_err(|_| ())?)),
29            Marker::I32 => Ok(BsInt::I32(rmp::decode::read_i32(rd).map_err(|_| ())?)),
30            Marker::I64 => Ok(BsInt::I64(rmp::decode::read_i64(rd).map_err(|_| ())?)),
31            Marker::U8 => Ok(BsInt::U8(rmp::decode::read_u8(rd).map_err(|_| ())?)),
32            Marker::U16 => Ok(BsInt::U16(rmp::decode::read_u16(rd).map_err(|_| ())?)),
33            Marker::U32 => Ok(BsInt::U32(rmp::decode::read_u32(rd).map_err(|_| ())?)),
34            Marker::U64 => Ok(BsInt::U64(rmp::decode::read_u64(rd).map_err(|_| ())?)),
35            //_ => Err(NtError::InvalidIntMarker),
36            _ => Err(()),
37        }
38    }
39
40    fn encode<W: RmpWrite>(wr: &mut W, val: Self) -> Result<(), ()> {
41        use rmp::encode::*;
42        let ret = match val {
43            BsInt::I8(val) => write_i8(wr, val),
44            BsInt::I16(val) => write_i16(wr, val),
45            BsInt::I32(val) => write_i32(wr, val),
46            BsInt::I64(val) => write_i64(wr, val),
47            BsInt::U8(val) => write_u8(wr, val),
48            BsInt::U16(val) => write_u16(wr, val),
49            BsInt::U32(val) => write_u32(wr, val),
50            BsInt::U64(val) => write_u64(wr, val),
51        };
52
53        ret.map_err(|_| ())?;
54
55        Ok(())
56    }
57}
58
59impl From<i8> for BsInt {
60    fn from(val: i8) -> Self {
61        BsInt::I8(val)
62    }
63}
64impl From<i16> for BsInt {
65    fn from(val: i16) -> Self {
66        BsInt::I16(val)
67    }
68}
69impl From<i32> for BsInt {
70    fn from(val: i32) -> Self {
71        BsInt::I32(val)
72    }
73}
74impl From<i64> for BsInt {
75    fn from(val: i64) -> Self {
76        BsInt::I64(val)
77    }
78}
79impl From<u8> for BsInt {
80    fn from(val: u8) -> Self {
81        BsInt::U8(val)
82    }
83}
84impl From<u16> for BsInt {
85    fn from(val: u16) -> Self {
86        BsInt::U16(val)
87    }
88}
89impl From<u32> for BsInt {
90    fn from(val: u32) -> Self {
91        BsInt::U32(val)
92    }
93}
94impl From<u64> for BsInt {
95    fn from(val: u64) -> Self {
96        BsInt::U64(val)
97    }
98}