1pub mod binary_protocol;
2pub use self::binary_protocol::BinaryProtocol;
3
4use std::{io, convert, error, fmt};
5use byteorder;
6use std::string::FromUtf8Error;
7
8#[derive(Debug)]
9pub enum Error {
10 EOF,
11 Byteorder(byteorder::Error),
12 Io(io::Error),
13 Utf8Error(FromUtf8Error),
14 BadVersion,
15 ProtocolVersionMissing,
16}
17
18impl fmt::Display for Error {
19 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
20 fmt::Debug::fmt(self, f)
21 }
22}
23
24impl error::Error for Error {
25 fn description(&self) -> &str {
26 match self {
27 &Error::EOF => "eof",
28 &Error::Byteorder(_) => "internal error of byteorder",
29 &Error::Io(_) => "internal error of io",
30 &Error::Utf8Error(_) => "internal error of utf8 conversion",
31 &Error::BadVersion => "bad version",
32 &Error::ProtocolVersionMissing => "protocol version missing",
33 }
34 }
35
36 fn cause(&self) -> Option<&error::Error> {
37 match self {
38 &Error::EOF => None,
39 &Error::Byteorder(ref e) => Some(e),
40 &Error::Io(ref e) => Some(e),
41 &Error::Utf8Error(ref e) => Some(e),
42 &Error::BadVersion => None,
43 &Error::ProtocolVersionMissing => None,
44 }
45 }
46}
47
48
49impl convert::From<byteorder::Error> for Error {
50 fn from(err: byteorder::Error) -> Error {
51 match err {
52 byteorder::Error::UnexpectedEOF => Error::EOF,
53 err => Error::Byteorder(err),
54 }
55 }
56}
57
58impl convert::From<FromUtf8Error> for Error {
59 fn from(err: FromUtf8Error) -> Error {
60 Error::Utf8Error(err)
61 }
62}
63
64impl convert::From<io::Error> for Error {
65 fn from(err: io::Error) -> Error {
66 Error::Io(err)
67 }
68}
69
70impl convert::From<Error> for io::Error {
71 fn from(err: Error) -> io::Error {
72 match err {
73 Error::Io(e) => e,
74 e => io::Error::new(io::ErrorKind::InvalidData, e),
75 }
76 }
77}
78
79
80#[derive(PartialEq, Eq, Debug)]
81pub enum ThriftType {
82 Stop = 0,
83 Void = 1,
84 Bool = 2,
85 Byte = 3,
86 Double = 4,
87 I16 = 6,
88 I32 = 8,
89 U64 = 9,
90 I64 = 10,
91 String = 11,
92 Struct = 12,
93 Map = 13,
94 Set = 14,
95 List = 15,
96}
97
98impl convert::From<i8> for ThriftType {
99 fn from(val: i8) -> ThriftType {
100 match val {
101 0 => ThriftType::Stop,
102 1 => ThriftType::Void,
103 2 => ThriftType::Bool,
104 3 => ThriftType::Byte,
105 4 => ThriftType::Double,
106 6 => ThriftType::I16,
107 8 => ThriftType::I32,
108 9 => ThriftType::U64,
109 10 => ThriftType::I64,
110 11 => ThriftType::String,
111 12 => ThriftType::Struct,
112 13 => ThriftType::Map,
113 14 => ThriftType::Set,
114 15 => ThriftType::List,
115 e => panic!("Unexpected value: {}", e),
116 }
117 }
118}
119
120#[derive(PartialEq, Eq, Debug)]
121pub enum ThriftMessageType {
122 Call = 1,
123 Reply = 2,
124 Exception = 3,
125 Oneway = 4,
126}
127
128impl convert::From<i8> for ThriftMessageType {
129 fn from(val: i8) -> ThriftMessageType {
130 match val {
131 1 => ThriftMessageType::Call,
132 2 => ThriftMessageType::Reply,
133 3 => ThriftMessageType::Exception,
134 4 => ThriftMessageType::Oneway,
135 _ => panic!("Unexpected value for ThriftMessageType."),
136 }
137 }
138}
139
140pub trait Serializer {
141 fn serialize_bool(&mut self, val: bool) -> Result<(), Error>;
142 fn serialize_str(&mut self, val: &str) -> Result<(), Error>;
143 fn serialize_string(&mut self, val: String) -> Result<(), Error>;
144 fn serialize_usize(&mut self, val: usize) -> Result<(), Error>;
145 fn serialize_isize(&mut self, val: isize) -> Result<(), Error>;
146 fn serialize_u64(&mut self, val: u64) -> Result<(), Error>;
147 fn serialize_i64(&mut self, val: i64) -> Result<(), Error>;
148 fn serialize_i32(&mut self, val: i32) -> Result<(), Error>;
149 fn serialize_u32(&mut self, val: u32) -> Result<(), Error>;
150 fn serialize_i16(&mut self, val: i16) -> Result<(), Error>;
151 fn serialize_u16(&mut self, val: u16) -> Result<(), Error>;
152 fn serialize_u8(&mut self, val: u8) -> Result<(), Error>;
153 fn serialize_i8(&mut self, val: i8) -> Result<(), Error>;
154 fn serialize_f64(&mut self, val: f64) -> Result<(), Error>;
155 fn serialize_bytes(&mut self, val: &[u8]) -> Result<(), Error>;
156}
157
158pub trait Deserializer {
159 fn deserialize_bool(&mut self) -> Result<bool, Error>;
160 fn deserialize_usize(&mut self) -> Result<usize, Error>;
161 fn deserialize_isize(&mut self) -> Result<isize, Error>;
162 fn deserialize_u64(&mut self) -> Result<u64, Error>;
163 fn deserialize_i64(&mut self) -> Result<i64, Error>;
164 fn deserialize_u32(&mut self) -> Result<u32, Error>;
165 fn deserialize_i32(&mut self) -> Result<i32, Error>;
166 fn deserialize_u16(&mut self) -> Result<u16, Error>;
167 fn deserialize_i16(&mut self) -> Result<i16, Error>;
168 fn deserialize_u8(&mut self) -> Result<u8, Error>;
169 fn deserialize_i8(&mut self) -> Result<i8, Error>;
170 fn deserialize_f64(&mut self) -> Result<f64, Error>;
171 fn deserialize_bytes(&mut self) -> Result<Vec<u8>, Error>;
172 fn deserialize_str(&mut self) -> Result<String, Error>;
173}
174
175pub trait Serialize {
176 fn serialize<S>(&self, s: &mut S) -> Result<(), Error> where S: Serializer + ThriftSerializer;
177}
178
179pub trait ThriftSerializer {
180 fn write_message_begin(&mut self,
181 _name: &str,
182 _message_type: ThriftMessageType)
183 -> Result<(), Error> {
184 Ok(())
185 }
186
187 fn write_struct_begin(&mut self, _name: &str) -> Result<(), Error> {
188 Ok(())
189 }
190
191 fn write_struct_end(&mut self) -> Result<(), Error> {
192 Ok(())
193 }
194
195 fn write_field_begin(&mut self, _name: &str, _ty: ThriftType, _id: i16) -> Result<(), Error> {
196 Ok(())
197 }
198
199 fn write_field_end(&mut self) -> Result<(), Error> {
200 Ok(())
201 }
202
203 fn write_field_stop(&mut self) -> Result<(), Error> {
204 Ok(())
205 }
206
207 fn write_message_end(&mut self) -> Result<(), Error> {
208 Ok(())
209 }
210}
211
212#[derive(Debug)]
213pub struct ThriftMessage {
214 pub name: String,
215 pub ty: ThriftMessageType,
216 pub seq: i16,
217}
218#[derive(Debug)]
219pub struct ThriftField {
220 pub name: Option<String>,
221 pub ty: ThriftType,
222 pub seq: i16,
223}
224
225pub trait ThriftDeserializer {
226 fn read_message_begin(&mut self) -> Result<ThriftMessage, Error>;
227 fn read_message_end(&mut self) -> Result<(), Error>;
228 fn read_struct_begin(&mut self) -> Result<String, Error>;
229 fn read_struct_end(&mut self) -> Result<(), Error>;
230 fn read_field_begin(&mut self) -> Result<ThriftField, Error>;
231 fn read_field_end(&mut self) -> Result<(), Error>;
232}
233
234pub trait Deserialize: Sized {
235 fn deserialize<D>(de: &mut D) -> Result<Self, Error> where D: Deserializer + ThriftDeserializer;
236}
237
238impl Deserialize for u8 {
248 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
249 where D: Deserializer + ThriftDeserializer
250 {
251 de.deserialize_u8()
252 }
253}
254
255impl Deserialize for bool {
256 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
257 where D: Deserializer + ThriftDeserializer
258 {
259 de.deserialize_bool()
260 }
261}
262
263impl Deserialize for i8 {
273 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
274 where D: Deserializer + ThriftDeserializer
275 {
276 de.deserialize_i8()
277 }
278}
279
280impl Deserialize for u16 {
281 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
282 where D: Deserializer + ThriftDeserializer
283 {
284 de.deserialize_u16()
285 }
286}
287
288impl Deserialize for i16 {
289 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
290 where D: Deserializer + ThriftDeserializer
291 {
292 de.deserialize_i16()
293 }
294}
295
296impl Deserialize for u32 {
297 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
298 where D: Deserializer + ThriftDeserializer
299 {
300 de.deserialize_u32()
301 }
302}
303
304impl Deserialize for i32 {
305 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
306 where D: Deserializer + ThriftDeserializer
307 {
308 de.deserialize_i32()
309 }
310}
311
312impl Deserialize for u64 {
313 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
314 where D: Deserializer + ThriftDeserializer
315 {
316 de.deserialize_u64()
317 }
318}
319
320impl Deserialize for i64 {
321 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
322 where D: Deserializer + ThriftDeserializer
323 {
324 de.deserialize_i64()
325 }
326}
327
328impl Deserialize for f64 {
329 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
330 where D: Deserializer + ThriftDeserializer
331 {
332 de.deserialize_f64()
333 }
334}
335
336impl Deserialize for String {
337 fn deserialize<D>(de: &mut D) -> Result<Self, Error>
338 where D: Deserializer + ThriftDeserializer
339 {
340 de.deserialize_str()
341 }
342}
343
344impl Serialize for () {
345 fn serialize<S>(&self, _s: &mut S) -> Result<(), Error>
346 where S: Serializer + ThriftSerializer
347 {
348 Ok(())
349 }
350}
351
352impl Serialize for bool {
353 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
354 where S: Serializer + ThriftSerializer
355 {
356 s.serialize_bool(*self)
357 }
358}
359
360impl<'a> Serialize for &'a str {
361 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
362 where S: Serializer + ThriftSerializer
363 {
364 s.serialize_str(self)
365 }
366}
367
368impl Serialize for String {
369 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
370 where S: Serializer + ThriftSerializer
371 {
372 s.serialize_string(self.clone())
373 }
374}
375
376impl Serialize for usize {
377 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
378 where S: Serializer + ThriftSerializer
379 {
380 s.serialize_usize(*self)
381 }
382}
383
384impl Serialize for isize {
385 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
386 where S: Serializer + ThriftSerializer
387 {
388 s.serialize_isize(*self)
389 }
390}
391
392impl Serialize for u64 {
393 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
394 where S: Serializer + ThriftSerializer
395 {
396 s.serialize_u64(*self)
397 }
398}
399
400impl Serialize for i64 {
401 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
402 where S: Serializer + ThriftSerializer
403 {
404 s.serialize_i64(*self)
405 }
406}
407
408impl Serialize for i32 {
409 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
410 where S: Serializer + ThriftSerializer
411 {
412 s.serialize_i32(*self)
413 }
414}
415
416impl Serialize for u32 {
417 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
418 where S: Serializer + ThriftSerializer
419 {
420 s.serialize_u32(*self)
421 }
422}
423
424impl Serialize for u16 {
425 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
426 where S: Serializer + ThriftSerializer
427 {
428 s.serialize_u16(*self)
429 }
430}
431
432impl Serialize for i16 {
433 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
434 where S: Serializer + ThriftSerializer
435 {
436 s.serialize_i16(*self)
437 }
438}
439
440impl Serialize for i8 {
441 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
442 where S: Serializer + ThriftSerializer
443 {
444 s.serialize_i8(*self)
445 }
446}
447
448impl Serialize for u8 {
449 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
450 where S: Serializer + ThriftSerializer
451 {
452 s.serialize_u8(*self)
453 }
454}
455
456impl Serialize for f64 {
457 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
458 where S: Serializer + ThriftSerializer
459 {
460 s.serialize_f64(*self)
461 }
462}
463
464impl<'a> Serialize for &'a [u8] {
465 fn serialize<S>(&self, s: &mut S) -> Result<(), Error>
466 where S: Serializer + ThriftSerializer
467 {
468 s.serialize_bytes(self)
469 }
470}