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(()),
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}