tars_stream/
tars_trait.rs

1use bytes::Bytes;
2use errors::{DecodeErr, EncodeErr};
3use std::collections::BTreeMap;
4use tars_decoder::TarsDecoder;
5use tars_encoder::TarsEncoder;
6
7// Tars Struct 需要实现此trait
8pub trait StructFromTars {
9    fn _decode_from(decoder: &mut TarsDecoder) -> Result<Self, DecodeErr>
10    where
11        Self: Sized;
12}
13
14// Tars Struct 需要实现此trait
15pub trait StructToTars {
16    fn _encode_to(&self, encoder: &mut TarsEncoder) -> Result<(), EncodeErr>;
17}
18
19// Tars Enum 需要实现此 trait
20pub trait EnumFromI32 {
21    fn _from_i32(ele: i32) -> Result<Self, DecodeErr>
22    where
23        Self: Sized;
24}
25
26// Tars Enum 需要实现此 trait
27pub trait EnumToI32 {
28    fn _to_i32(&self) -> i32;
29}
30
31// Tars 所有类型需要实现此trait
32pub trait ClassName {
33    fn _class_name() -> String;
34}
35
36impl ClassName for bool {
37    fn _class_name() -> String {
38        String::from("bool")
39    }
40}
41
42impl ClassName for i8 {
43    fn _class_name() -> String {
44        String::from("char")
45    }
46}
47
48impl ClassName for i16 {
49    fn _class_name() -> String {
50        String::from("short")
51    }
52}
53
54impl ClassName for i32 {
55    fn _class_name() -> String {
56        String::from("int32")
57    }
58}
59
60impl ClassName for i64 {
61    fn _class_name() -> String {
62        String::from("int64")
63    }
64}
65
66impl ClassName for u8 {
67    fn _class_name() -> String {
68        String::from("short")
69    }
70}
71
72impl ClassName for u16 {
73    fn _class_name() -> String {
74        String::from("int32")
75    }
76}
77
78impl ClassName for u32 {
79    fn _class_name() -> String {
80        String::from("int64")
81    }
82}
83
84impl ClassName for f32 {
85    fn _class_name() -> String {
86        String::from("float")
87    }
88}
89
90impl ClassName for f64 {
91    fn _class_name() -> String {
92        String::from("double")
93    }
94}
95
96impl ClassName for String {
97    fn _class_name() -> String {
98        String::from("string")
99    }
100}
101
102impl<K, V> ClassName for BTreeMap<K, V>
103where
104    K: ClassName + Ord,
105    V: ClassName,
106{
107    fn _class_name() -> String {
108        String::from("map<")
109            + &K::_class_name()
110            + &String::from(",")
111            + &V::_class_name()
112            + &String::from(">")
113    }
114}
115
116impl<T> ClassName for Vec<T>
117where
118    T: ClassName,
119{
120    fn _class_name() -> String {
121        // List not list
122        String::from("List<") + &T::_class_name() + &String::from(">")
123    }
124}
125
126impl ClassName for Bytes {
127    fn _class_name() -> String {
128        String::from("list<byte>")
129    }
130}