1use super::{Serializer, Deserializer, ThriftSerializer, ThriftField, ThriftMessage, ThriftDeserializer, ThriftMessageType, ThriftType, Error};
2use transport::{VoidTransport, ReadTransport, WriteTransport};
3use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
4use std::iter;
5
6#[allow(overflowing_literals)]
7pub const THRIFT_VERSION_1: i32 = 0x80010000;
8#[allow(overflowing_literals)]
9pub const THRIFT_VERSION_MASK: i32 = 0xffff0000;
10#[allow(overflowing_literals)]
11pub const THRIFT_TYPE_MASK: i32 = 0x000000ff;
12
13pub struct BinaryProtocol<T>{
14 inner: T
15}
16
17impl <T>BinaryProtocol<T> {
18 pub fn into_inner(self) -> T {
19 self.inner
20 }
21}
22
23impl <T: VoidTransport>BinaryProtocol<T> {
24 pub fn new(inner: T) -> Self {
25 BinaryProtocol{
26 inner: inner,
27 }
28 }
29}
30
31impl <T: VoidTransport>From<T> for BinaryProtocol<T> {
32 fn from(w: T) -> Self {
33 Self::new(w)
34 }
35}
36
37impl <T: WriteTransport> Serializer for BinaryProtocol<T> {
38
39 fn serialize_bool(&mut self, val: bool) -> Result<(), Error> {
40 if val {
41 self.serialize_i8(1)
42 } else {
43 self.serialize_i8(0)
44 }
45 }
46
47 fn serialize_usize(&mut self, val: usize) -> Result<(), Error> {
48 self.serialize_isize(val as isize)
49 }
50
51 fn serialize_isize(&mut self, val: isize) -> Result<(), Error> {
52 self.serialize_i64(val as i64)
53 }
54
55 fn serialize_u64(&mut self, val: u64) -> Result<(), Error> {
56 self.serialize_i64(val as i64)
57 }
58
59 fn serialize_i64(&mut self, val: i64) -> Result<(), Error> {
60 try!(self.inner.write_i64::<BigEndian>(val));
61 Ok(())
62 }
63
64 fn serialize_u32(&mut self, val: u32) -> Result<(), Error> {
65 self.serialize_i32(val as i32)
66 }
67
68 fn serialize_i32(&mut self, val: i32) -> Result<(), Error> {
69 try!(self.inner.write_i32::<BigEndian>(val));
70 Ok(())
71 }
72
73 fn serialize_u16(&mut self, val: u16) -> Result<(), Error> {
74 self.serialize_i16(val as i16)
75 }
76
77 fn serialize_i16(&mut self, val: i16) -> Result<(), Error> {
78 try!(self.inner.write_i16::<BigEndian>(val));
79 Ok(())
80 }
81
82 fn serialize_u8(&mut self, val: u8) -> Result<(), Error> {
83 self.serialize_i8(val as i8)
84 }
85
86 fn serialize_i8(&mut self, val: i8) -> Result<(), Error> {
87 try!(self.inner.write_i8(val));
88 Ok(())
89 }
90
91 fn serialize_f64(&mut self, val: f64) -> Result<(), Error> {
92 try!(self.inner.write_f64::<BigEndian>(val));
93 Ok(())
94 }
95
96 fn serialize_bytes(&mut self, val: &[u8]) -> Result<(), Error> {
97 try!(self.serialize_i32(val.len() as i32));
98 try!(self.inner.write(val));
99 Ok(())
100 }
101
102 fn serialize_str(&mut self, val: &str) -> Result<(), Error> {
103 self.serialize_bytes(val.as_bytes())
104 }
105
106 fn serialize_string(&mut self, val: String) -> Result<(), Error> {
107 self.serialize_str(&*val)
108 }
109}
110
111impl <T: WriteTransport>ThriftSerializer for BinaryProtocol<T> {
112 fn write_message_begin(&mut self, name: &str, message_type: ThriftMessageType) -> Result<(), Error> {
113 let version = THRIFT_VERSION_1 | message_type as i32;
114
115 try!(self.serialize_i32(version));
116 try!(self.serialize_str(name));
117 try!(self.serialize_i16(0));
118
119 Ok(())
120 }
121
122 fn write_struct_begin(&mut self, _name: &str) -> Result<(), Error> {
123 Ok(())
124 }
125
126 fn write_struct_end(&mut self) -> Result<(), Error> {
127 Ok(())
128 }
129
130 fn write_field_begin(&mut self, _name: &str, ty: ThriftType, id: i16) -> Result<(), Error> {
131 try!(self.serialize_i8(ty as i8));
132 try!(self.serialize_i16(id));
133 Ok(())
134 }
135
136 fn write_field_end(&mut self) -> Result<(), Error> {
137 Ok(())
138 }
139
140 fn write_field_stop(&mut self) -> Result<(), Error> {
141 try!(self.serialize_i8(ThriftType::Stop as i8));
142 Ok(())
143 }
144
145 fn write_message_end(&mut self) -> Result<(), Error> {
146 Ok(())
147 }
148}
149
150
151
152impl<T: ReadTransport> Deserializer for BinaryProtocol<T> {
153 fn deserialize_bool(&mut self) -> Result<bool, Error> {
154 Ok(try!(self.inner.read_i8()) != 0)
155 }
156
157 fn deserialize_usize(&mut self) -> Result<usize, Error> {
158 Ok(try!(self.deserialize_isize()) as usize)
159 }
160
161 fn deserialize_isize(&mut self) -> Result<isize, Error> {
162 Ok(try!(self.deserialize_i64()) as isize)
163 }
164
165 fn deserialize_u64(&mut self) -> Result<u64, Error> {
166 Ok(try!(self.deserialize_i64()) as u64)
167 }
168
169 fn deserialize_i64(&mut self) -> Result<i64, Error> {
170 Ok(try!(self.inner.read_i64::<BigEndian>()))
171 }
172
173 fn deserialize_u32(&mut self) -> Result<u32, Error> {
174 Ok(try!(self.deserialize_i32()) as u32)
175 }
176
177 fn deserialize_i32(&mut self) -> Result<i32, Error> {
178 Ok(try!(self.inner.read_i32::<BigEndian>()))
179 }
180
181 fn deserialize_u16(&mut self) -> Result<u16, Error> {
182 Ok(try!(self.deserialize_i16()) as u16)
183 }
184
185 fn deserialize_i16(&mut self) -> Result<i16, Error> {
186 Ok(try!(self.inner.read_i16::<BigEndian>()))
187 }
188
189 fn deserialize_u8(&mut self) -> Result<u8, Error> {
190 Ok(try!(self.deserialize_i8()) as u8)
191 }
192
193 fn deserialize_i8(&mut self) -> Result<i8, Error> {
194 Ok(try!(self.inner.read_i8()))
195 }
196
197 fn deserialize_f64(&mut self) -> Result<f64, Error> {
198 Ok(try!(self.inner.read_f64::<BigEndian>()))
199 }
200
201
202 fn deserialize_bytes(&mut self) -> Result<Vec<u8>, Error> {
203 let len = try!(self.deserialize_i32()) as usize;
204 let mut buf = Vec::with_capacity(len);
205
206 buf.extend(iter::repeat(0).take(len));
207 try!(self.inner.read(&mut buf));
208
209 Ok(buf)
210 }
211
212 fn deserialize_str(&mut self) -> Result<String, Error> {
213 let buf = try!(self.deserialize_bytes());
214 let s = try!(String::from_utf8(buf));
215 Ok(s)
216 }
217}
218
219impl<T: ReadTransport> ThriftDeserializer for BinaryProtocol<T> {
220 fn read_message_begin(&mut self) -> Result<ThriftMessage, Error> {
221 let size: i32 = try!(self.deserialize_i32());
222
223 if size < 0 {
224 let version = size & THRIFT_VERSION_MASK;
225 if version != THRIFT_VERSION_1 {
226 Err(Error::BadVersion)
227 } else {
228 Ok(ThriftMessage {
229 name: try!(self.deserialize_str()),
230 ty: ThriftMessageType::from((size & THRIFT_TYPE_MASK) as i8),
231 seq: try!(self.deserialize_i16())
232 })
233 }
234 } else {
235 Err(Error::ProtocolVersionMissing)
236 }
237 }
238
239 fn read_message_end(&mut self) -> Result<(), Error> {
240 Ok(())
241 }
242
243 fn read_struct_begin(&mut self) -> Result<String, Error> {
244 Ok("".to_string())
245 }
246
247 fn read_struct_end(&mut self) -> Result<(), Error> {
248 Ok(())
249 }
250
251 fn read_field_begin(&mut self) -> Result<ThriftField, Error> {
252 let mut field = ThriftField {
253 name: None,
254 ty: ThriftType::from(try!(self.deserialize_i8())),
255 seq: 0
256 };
257
258 if field.ty == ThriftType::Stop {
259 Ok(field)
260 } else {
261 field.seq = try!(self.deserialize_i16());
262 Ok(field)
263 }
264 }
265
266 fn read_field_end(&mut self) -> Result<(), Error> {
267 Ok(())
268 }
269}
270
271
272#[cfg(test)]
273mod tests {
274 use std::io::{Cursor, Read, Write};
275 use byteorder::{ReadBytesExt, WriteBytesExt, BigEndian};
276 use protocol::{ThriftMessageType, ThriftType, ThriftMessage, ThriftDeserializer, ThriftSerializer, Serializer, Serialize, Deserializer};
277 use super::*;
278 use ::Deserialize;
279
280
281 #[test]
282 fn deserialize_bool() {
283 let mut de = BinaryProtocol::new(Cursor::new(vec![1u8]));
284 let val: bool = Deserialize::deserialize(&mut de).unwrap();
285 assert_eq!(val, true);
286 }
287
288 #[test]
289 fn deserialize_u16() {
290 let mut buf = Vec::new();
291 buf.write_u16::<BigEndian>(32000);
292 let mut de = BinaryProtocol::new(Cursor::new(buf));
293 let val: u16 = Deserialize::deserialize(&mut de).unwrap();
294 assert_eq!(val, 32000);
295 }
296
297 #[test]
298 fn deserialize_i16() {
299 let mut buf = Vec::new();
300 buf.write_i16::<BigEndian>(-32000);
301 let mut de = BinaryProtocol::new(Cursor::new(buf));
302 let val: i16 = Deserialize::deserialize(&mut de).unwrap();
303 assert_eq!(val, -32000);
304 }
305
306 #[test]
307 fn deserialize_u32() {
308 let mut buf = Vec::new();
309 buf.write_u32::<BigEndian>(32000);
310 let mut de = BinaryProtocol::new(Cursor::new(buf));
311 let val: u32 = Deserialize::deserialize(&mut de).unwrap();
312 assert_eq!(val, 32000);
313 }
314
315 #[test]
316 fn deserialize_i32() {
317 let mut buf = Vec::new();
318 buf.write_i32::<BigEndian>(32000);
319 let mut de = BinaryProtocol::new(Cursor::new(buf));
320 let val: i32 = Deserialize::deserialize(&mut de).unwrap();
321 assert_eq!(val, 32000);
322 }
323
324 #[test]
325 fn deserialize_u64() {
326 let mut buf = Vec::new();
327 buf.write_u64::<BigEndian>(32000);
328 let mut de = BinaryProtocol::new(Cursor::new(buf));
329 let val: u64 = Deserialize::deserialize(&mut de).unwrap();
330 assert_eq!(val, 32000);
331 }
332
333 #[test]
334 fn deserialize_i64() {
335 let mut buf = Vec::new();
336 buf.write_i64::<BigEndian>(32000);
337 let mut de = BinaryProtocol::new(Cursor::new(buf));
338 let val: i64 = Deserialize::deserialize(&mut de).unwrap();
339 assert_eq!(val, 32000);
340 }
341
342 #[test]
343 fn deserialize_f64() {
344 let mut buf = Vec::new();
345 buf.write_f64::<BigEndian>(32000.0);
346 let mut de = BinaryProtocol::new(Cursor::new(buf));
347 let val: f64 = Deserialize::deserialize(&mut de).unwrap();
348 assert_eq!(val, 32000.0);
349 }
350
351 #[test]
352 fn deserialize_string() {
353 let mut buf = Vec::new();
354 let i = "foobar";
355 buf.write_i32::<BigEndian>(i.len() as i32);
356 buf.write(i.as_bytes());
357 let mut de = BinaryProtocol::new(Cursor::new(buf));
358 let val: String = Deserialize::deserialize(&mut de).unwrap();
359 assert_eq!(&*val, "foobar");
360 }
361
362 #[test]
363 fn serialize_bool_true() {
364 let mut v: Vec<u8> = Vec::new();
365 {
366 let mut s = BinaryProtocol::new(&mut v);
367 s.serialize_bool(true);
368 }
369
370 assert_eq!(v[0], 1);
371 }
372
373 #[test]
374 fn serialize_bool_false() {
375 let mut v = Vec::new();
376 {
377 let mut s = BinaryProtocol::new(&mut v);
378 s.serialize_bool(false);
379 }
380
381 assert_eq!(v[0], 0);
382 }
383
384 #[test]
385 fn serialize_i8() {
386 let mut v = Vec::new();
387 {
388 let mut s = BinaryProtocol::new(&mut v);
389 s.serialize_i8(5);
390 }
391
392 assert_eq!(v[0], 5);
393 }
394
395 #[test]
396 fn serialize_i8_neg() {
397 let mut v = Vec::new();
398 {
399 let mut s = BinaryProtocol::new(&mut v);
400 s.serialize_i8(-5);
401 }
402
403 assert_eq!(v[0] as i8, -5);
404 }
405
406 #[test]
407 fn serialize_i16() {
408 let mut v = Vec::new();
409 {
410 let mut s = BinaryProtocol::new(&mut v);
411 s.serialize_i16(900);
412 }
413
414 let mut cursor = Cursor::new(v);
415 assert_eq!(900, cursor.read_i16::<BigEndian>().unwrap());
416 }
417
418 #[test]
419 fn serialize_i16_neg() {
420 let mut v = Vec::new();
421 {
422 let mut s = BinaryProtocol::new(&mut v);
423 s.serialize_i16(-900);
424 }
425
426 let mut cursor = Cursor::new(v);
427 assert_eq!(-900, cursor.read_i16::<BigEndian>().unwrap());
428 }
429
430 #[test]
431 fn serialize_i32() {
432 let mut v = Vec::new();
433 {
434 let mut s = BinaryProtocol::new(&mut v);
435 s.serialize_i32(3000000);
436 }
437
438 let mut cursor = Cursor::new(v);
439 assert_eq!(3000000, cursor.read_i32::<BigEndian>().unwrap());
440 }
441
442 #[test]
443 fn serialize_i32_neg() {
444 let mut v = Vec::new();
445 {
446 let mut s = BinaryProtocol::new(&mut v);
447 s.serialize_i32(-3000000);
448 }
449
450 let mut cursor = Cursor::new(v);
451 assert_eq!(-3000000, cursor.read_i32::<BigEndian>().unwrap());
452 }
453
454 #[test]
455 fn serialize_i64() {
456 let mut v = Vec::new();
457 {
458 let mut s = BinaryProtocol::new(&mut v);
459 s.serialize_i64(33000000);
460 }
461
462 let mut cursor = Cursor::new(v);
463 assert_eq!(33000000, cursor.read_i64::<BigEndian>().unwrap());
464 }
465
466 #[test]
467 fn serialize_i64_neg() {
468 let mut v = Vec::new();
469 {
470 let mut s = BinaryProtocol::new(&mut v);
471 s.serialize_i64(-33000000);
472 }
473
474 let mut cursor = Cursor::new(v);
475 assert_eq!(-33000000, cursor.read_i64::<BigEndian>().unwrap());
476 }
477
478 #[test]
479 fn protocol_begin() {
480 let mut v = Vec::new();
481 {
482 let mut proto = BinaryProtocol::new(&mut v);
483 proto.write_message_begin("foobar", ThriftMessageType::Call);
484 }
485
486 let mut cursor = Cursor::new(v);
487 let version = THRIFT_VERSION_1 | ThriftMessageType::Call as i32;
488
489 assert_eq!(version, cursor.read_i32::<BigEndian>().unwrap());
490 }
492
493 #[test]
494 fn write_and_read_message_begin() {
495 let mut buf = Vec::new();
496
497 {
498 let mut se = BinaryProtocol::new(&mut buf);
499 se.write_message_begin("Foobar123", ThriftMessageType::Call);
500 }
501
502 let mut de = BinaryProtocol::new(Cursor::new(buf));
503 let msg = de.read_message_begin().unwrap();
504
505 assert_eq!(msg.name, "Foobar123");
506 assert_eq!(msg.ty, ThriftMessageType::Call);
507 }
508}