1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use value::AMQPValue;
use std::collections::BTreeMap;
use std::fmt;
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub enum AMQPType {
Boolean,
ShortShortInt,
ShortShortUInt,
ShortInt,
ShortUInt,
LongInt,
LongUInt,
LongLongInt,
LongLongUInt,
Float,
Double,
DecimalValue,
ShortString,
LongString,
FieldArray,
Timestamp,
FieldTable,
Void,
}
impl AMQPType {
pub fn from_id(id: char) -> Option<AMQPType> {
match id {
't' => Some(AMQPType::Boolean),
'b' => Some(AMQPType::ShortShortInt),
'B' => Some(AMQPType::ShortShortUInt),
'U' => Some(AMQPType::ShortInt),
'u' => Some(AMQPType::ShortUInt),
'I' => Some(AMQPType::LongInt),
'i' => Some(AMQPType::LongUInt),
'L' => Some(AMQPType::LongLongInt),
'l' => Some(AMQPType::LongLongUInt),
'f' => Some(AMQPType::Float),
'd' => Some(AMQPType::Double),
'D' => Some(AMQPType::DecimalValue),
's' => Some(AMQPType::ShortString),
'S' => Some(AMQPType::LongString),
'A' => Some(AMQPType::FieldArray),
'T' => Some(AMQPType::Timestamp),
'F' => Some(AMQPType::FieldTable),
'V' => Some(AMQPType::Void),
_ => None,
}
}
pub fn get_id(&self) -> char {
match *self {
AMQPType::Boolean => 't',
AMQPType::ShortShortInt => 'b',
AMQPType::ShortShortUInt => 'B',
AMQPType::ShortInt => 'U',
AMQPType::ShortUInt => 'u',
AMQPType::LongInt => 'I',
AMQPType::LongUInt => 'i',
AMQPType::LongLongInt => 'L',
AMQPType::LongLongUInt => 'l',
AMQPType::Float => 'f',
AMQPType::Double => 'd',
AMQPType::DecimalValue => 'D',
AMQPType::ShortString => 's',
AMQPType::LongString => 'S',
AMQPType::FieldArray => 'A',
AMQPType::Timestamp => 'T',
AMQPType::FieldTable => 'F',
AMQPType::Void => 'V',
}
}
pub fn to_string(&self) -> String {
format!("{}", self)
}
}
impl fmt::Display for AMQPType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
pub type Boolean = bool;
pub type ShortShortInt = i8;
pub type ShortShortUInt = u8;
pub type ShortInt = i16;
pub type ShortUInt = u16;
pub type LongInt = i32;
pub type LongUInt = u32;
pub type LongLongInt = i64;
pub type LongLongUInt = u64;
pub type Float = f32;
pub type Double = f64;
pub type ShortString = String;
pub type LongString = String;
pub type FieldArray = Vec<AMQPValue>;
pub type Timestamp = LongLongUInt;
pub type FieldTable = BTreeMap<ShortString, AMQPValue>;
pub type Void = ();
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct DecimalValue {
pub scale: ShortShortUInt,
pub value: LongUInt,
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_type_from_id() {
assert_eq!(AMQPType::from_id('T'), Some(AMQPType::Timestamp));
assert_eq!(AMQPType::from_id('z'), None);
}
#[test]
fn test_type_to_string() {
assert_eq!(AMQPType::Boolean.to_string(), "Boolean");
assert_eq!(AMQPType::Void.to_string(), "Void");
}
}