1extern crate byteorder;
2extern crate uuid;
3
4pub mod segment;
5mod constants;
6mod utils;
7mod errors;
8
9use uuid::Uuid;
10use segment::Segment;
11use errors::TupleError;
12
13#[derive(Clone)]
14pub struct Tuple {
16 buffer: Vec<u8>
17}
18
19impl Tuple {
20 pub fn new() -> Tuple {
22 Tuple {
23 buffer: Vec::with_capacity(128)
24 }
25 }
26
27 pub fn with_capacity(capacity: usize) -> Tuple {
29 Tuple {
30 buffer: Vec::with_capacity(capacity)
31 }
32 }
33
34 pub fn from_bytes(bytes: &[u8]) -> Tuple {
51 Tuple {
52 buffer: Vec::from(bytes)
53 }
54 }
55
56 pub fn add_segment(&mut self, input: &Segment) {
61 input.encode(&mut self.buffer);
62 }
63
64 pub fn add_builder(&mut self, input: &Tuple) {
69 self.buffer.extend_from_slice(&input.buffer);
70 }
71
72 pub fn into_bytes(self) -> Vec<u8> {
74 self.buffer
75 }
76
77 pub fn as_bytes(&self) -> &[u8] {
79 &self.buffer
80 }
81
82 pub fn as_segments(&self) -> Result<Vec<Segment>, TupleError> {
84 Segment::decode(&self.buffer)
85 }
86}
87
88pub trait AddToTuple<T> where Self : Sized {
90
91 fn add(&mut self, input: T);
93
94 fn with(mut self, input: T) -> Self {
110 self.add(input);
111
112 self
113 }
114}
115
116impl AddToTuple<i64> for Tuple {
117 fn add(&mut self, v: i64) {
118 self.add_segment(&Segment::Integer(v));
119 }
120}
121
122impl AddToTuple<String> for Tuple {
123 fn add(&mut self, v: String) {
124 self.add_segment(&Segment::String(v));
125 }
126}
127
128impl<'a> AddToTuple<&'a [u8]> for Tuple {
129 fn add(&mut self, v: &'a [u8]) {
130 self.add_segment(&Segment::Bytes(Vec::from(v)));
131 }
132}
133
134impl<'a> AddToTuple<&'a Vec<u8>> for Tuple {
135 fn add(&mut self, v: &'a Vec<u8>) {
136 self.add_segment(&Segment::Bytes(v.clone()));
137 }
138}
139
140impl AddToTuple<f32> for Tuple {
141 fn add(&mut self, v: f32) {
142 self.add_segment(&Segment::Float(v));
143 }
144}
145
146impl AddToTuple<f64> for Tuple {
147 fn add(&mut self, v: f64) {
148 self.add_segment(&Segment::Double(v));
149 }
150}
151
152impl AddToTuple<Vec<u8>> for Tuple {
153 fn add(&mut self, v: Vec<u8>) {
154 self.add_segment(&Segment::Bytes(v));
155 }
156}
157
158impl AddToTuple<&'static str> for Tuple {
159 fn add(&mut self, v: &'static str) {
160 self.add_segment(&Segment::Const(v));
161 }
162}
163
164impl AddToTuple<Uuid> for Tuple {
165 fn add(&mut self, v: Uuid) {
166 self.add_segment(&Segment::UUID(v));
167 }
168}
169
170impl AddToTuple<Vec<Segment>> for Tuple {
171 fn add(&mut self, v: Vec<Segment>) {
172 self.add_segment(&Segment::Nested(v));
173 }
174}
175
176impl<'a> AddToTuple<&'a Tuple> for Tuple {
177 fn add(&mut self, v: &'a Tuple) {
178 self.add_builder(&v);
179 }
180}
181
182impl AddToTuple<Tuple> for Tuple {
183 fn add(&mut self, v: Tuple) {
184 self.add_builder(&v);
185 }
186}
187
188#[macro_export]
189macro_rules! tuple {
220 ($( $x:expr ),*) => {
221 {
222 use $crate::{Tuple, AddToTuple};
223
224 let mut builder = Tuple::new();
225 $(
226 builder.add($x);
227 )*
228 builder
229 }
230 };
231}
232
233#[cfg(test)]
234mod tests {
235 #[test]
236 fn test_tuple_macro() {
237 let result = tuple!("Test").into_bytes();
238
239 assert_eq!(result, vec![2, 84, 101, 115, 116, 0]);
240 }
241
242 #[test]
243 fn test_tuple_macro_prefix() {
244 let base_tuple = tuple!("user");
245 let result = tuple!(&base_tuple, "Test");
246
247 assert_eq!(result.into_bytes(), vec![2, 117, 115, 101, 114, 0, 2, 84, 101, 115, 116, 0]);
248 }
249
250 #[test]
251 fn test_vec_support() {
252 let tuple = tuple!(vec![1, 2, 3]);
253
254 assert_eq!(tuple.into_bytes(), vec![1, 1, 2, 3, 0]);
255 }
256
257 #[test]
258 fn test_u8_support() {
259 let binary: Vec<u8> = vec![1, 2, 3];
260 let tuple = tuple!(&binary);
261
262 assert_eq!(tuple.into_bytes(), vec![1, 1, 2, 3, 0]);
263 }
264}