Skip to content

Commit 718ded6

Browse files
committed
Cleanup to encoder, fixed tabs.
1 parent 9b83c28 commit 718ded6

File tree

6 files changed

+228
-319
lines changed

6 files changed

+228
-319
lines changed

examples/encode.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ fn main() {
1616
doc.insert("array".to_string(), Bson::Array(arr));
1717

1818
let mut buf = Vec::new();
19-
encode_document(&mut buf, &doc).unwrap();
19+
encode_document(&mut buf, &doc).unwrap();
2020

2121
println!("Encoded: {:?}", buf);
2222

23-
let mut r = Cursor::new(&buf[..]);
24-
let doc = decode_document(&mut r).unwrap();
25-
println!("Decoded: {:?}", doc);
23+
let doc = decode_document(&mut Cursor::new(&buf[..])).unwrap();
24+
println!("Decoded: {:?}", doc);
2625
}

src/bson.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use chrono::{DateTime, UTC};
2727
use rustc_serialize::json;
2828
use rustc_serialize::hex::ToHex;
2929

30-
use spec::BinarySubtype;
30+
use spec::{ElementType, BinarySubtype};
3131

3232
#[derive(Debug, Clone)]
3333
pub enum Bson {
@@ -53,6 +53,27 @@ pub type Array = Vec<Bson>;
5353
pub type Document = BTreeMap<String, Bson>;
5454

5555
impl Bson {
56+
pub fn element_type(&self) -> ElementType {
57+
match self {
58+
&Bson::FloatingPoint(..) => ElementType::FloatingPoint,
59+
&Bson::String(..) => ElementType::Utf8String,
60+
&Bson::Array(..) => ElementType::Array,
61+
&Bson::Document(..) => ElementType::EmbeddedDocument,
62+
&Bson::Boolean(..) => ElementType::Boolean,
63+
&Bson::Null => ElementType::NullValue,
64+
&Bson::RegExp(..) => ElementType::RegularExpression,
65+
&Bson::JavaScriptCode(..) => ElementType::JavaScriptCode,
66+
&Bson::JavaScriptCodeWithScope(..) => ElementType::JavaScriptCodeWithScope,
67+
&Bson::Deprecated => ElementType::Deprecated,
68+
&Bson::I32(..) => ElementType::Integer32Bit,
69+
&Bson::I64(..) => ElementType::Integer64Bit,
70+
&Bson::TimeStamp(..) => ElementType::TimeStamp,
71+
&Bson::Binary(..) => ElementType::Binary,
72+
&Bson::ObjectId(..) => ElementType::ObjectId,
73+
&Bson::UtcDatetime(..) => ElementType::UtcDatetime,
74+
}
75+
}
76+
5677
pub fn to_json(&self) -> json::Json {
5778
match self {
5879
&Bson::FloatingPoint(v) => json::Json::F64(v),

src/decoder.rs

Lines changed: 95 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -92,130 +92,132 @@ impl error::Error for DecoderError {
9292
pub type DecoderResult<T> = Result<T, DecoderError>;
9393

9494
fn read_string<R: Read + ?Sized>(reader: &mut R) -> DecoderResult<String> {
95-
let len = try!(reader.read_i32::<LittleEndian>());
95+
let len = try!(reader.read_i32::<LittleEndian>());
9696

97-
let mut s = String::with_capacity(len as usize - 1);
98-
try!(reader.take(len as u64 - 1).read_to_string(&mut s));
99-
try!(reader.read_u8()); // The last 0x00
97+
let mut s = String::with_capacity(len as usize - 1);
98+
try!(reader.take(len as u64 - 1).read_to_string(&mut s));
99+
try!(reader.read_u8()); // The last 0x00
100100

101-
Ok(s)
101+
Ok(s)
102102
}
103103

104104
fn read_cstring<R: Read + ?Sized>(reader: &mut R) -> DecoderResult<String> {
105-
let mut v = Vec::new();
105+
let mut v = Vec::new();
106106

107-
loop {
108-
let c = try!(reader.read_u8());
109-
if c == 0 { break; }
110-
v.push(c);
111-
}
107+
loop {
108+
let c = try!(reader.read_u8());
109+
if c == 0 { break; }
110+
v.push(c);
111+
}
112112

113-
Ok(try!(str::from_utf8(&v)).to_owned())
113+
Ok(try!(str::from_utf8(&v)).to_owned())
114114
}
115115

116+
#[inline]
116117
fn read_i32<R: Read + ?Sized>(reader: &mut R) -> DecoderResult<i32> {
117-
reader.read_i32::<LittleEndian>().map_err(From::from)
118+
reader.read_i32::<LittleEndian>().map_err(From::from)
118119
}
119120

121+
#[inline]
120122
fn read_i64<R: Read + ?Sized>(reader: &mut R) -> DecoderResult<i64> {
121-
reader.read_i64::<LittleEndian>().map_err(From::from)
123+
reader.read_i64::<LittleEndian>().map_err(From::from)
122124
}
123125

124126
pub fn decode_document<R: Read + ?Sized>(reader: &mut R) -> DecoderResult<Document> {
125-
let mut doc = Document::new();
127+
let mut doc = Document::new();
126128

127-
// disregard the length: using Read::take causes infinite type recursion
128-
try!(read_i32(reader));
129+
// disregard the length: using Read::take causes infinite type recursion
130+
try!(read_i32(reader));
129131

130-
loop {
131-
let tag = try!(reader.read_u8());
132+
loop {
133+
let tag = try!(reader.read_u8());
132134

133-
if tag == 0 {
134-
break;
135-
}
135+
if tag == 0 {
136+
break;
137+
}
136138

137-
let key = try!(read_cstring(reader));
138-
let val = try!(decode_bson(reader, tag));
139+
let key = try!(read_cstring(reader));
140+
let val = try!(decode_bson(reader, tag));
139141

140-
doc.insert(key, val);
141-
}
142+
doc.insert(key, val);
143+
}
142144

143-
Ok(doc)
145+
Ok(doc)
144146
}
145147

146148
fn decode_array<R: Read + ?Sized>(reader: &mut R) -> DecoderResult<Array> {
147-
let mut arr = Array::new();
149+
let mut arr = Array::new();
148150

149-
// disregard the length: using Read::take causes infinite type recursion
150-
try!(read_i32(reader));
151+
// disregard the length: using Read::take causes infinite type recursion
152+
try!(read_i32(reader));
151153

152-
loop {
153-
let tag = try!(reader.read_u8());
154-
if tag == 0 {
155-
break;
156-
}
154+
loop {
155+
let tag = try!(reader.read_u8());
156+
if tag == 0 {
157+
break;
158+
}
157159

158-
// check that the key is as expected
159-
let key = try!(read_cstring(reader));
160-
if key != &arr.len().to_string()[..] {
161-
return Err(DecoderError::InvalidArrayKey(arr.len(), key));
162-
}
160+
// check that the key is as expected
161+
let key = try!(read_cstring(reader));
162+
if key != &arr.len().to_string()[..] {
163+
return Err(DecoderError::InvalidArrayKey(arr.len(), key));
164+
}
163165

164-
let val = try!(decode_bson(reader, tag));
165-
arr.push(val)
166-
}
166+
let val = try!(decode_bson(reader, tag));
167+
arr.push(val)
168+
}
167169

168-
Ok(arr)
170+
Ok(arr)
169171
}
170172

171173
fn decode_bson<R: Read + ?Sized>(reader: &mut R, tag: u8) -> DecoderResult<Bson> {
172-
use spec::ElementType::*;
173-
match spec::ElementType::from(tag) {
174-
Some(FloatingPoint) => {
175-
Ok(Bson::FloatingPoint(try!(reader.read_f64::<LittleEndian>())))
176-
},
177-
Some(Utf8String) => read_string(reader).map(Bson::String),
178-
Some(EmbeddedDocument) => decode_document(reader).map(Bson::Document),
179-
Some(Array) => decode_array(reader).map(Bson::Array),
180-
Some(Binary) => {
181-
let len = try!(read_i32(reader));
182-
let subtype = BinarySubtype::from(try!(reader.read_u8()));
183-
let mut data = Vec::with_capacity(len as usize);
184-
try!(reader.take(len as u64).read_to_end(&mut data));
185-
Ok(Bson::Binary(subtype, data))
186-
}
187-
Some(ObjectId) => {
188-
let mut objid = [0; 12];
189-
for x in &mut objid {
190-
*x = try!(reader.read_u8());
191-
}
192-
Ok(Bson::ObjectId(objid))
193-
}
194-
Some(Boolean) => Ok(Bson::Boolean(try!(reader.read_u8()) != 0)),
195-
Some(NullValue) => Ok(Bson::Null),
196-
Some(RegularExpression) => {
197-
let pat = try!(read_cstring(reader));
198-
let opt = try!(read_cstring(reader));
199-
Ok(Bson::RegExp(pat, opt))
200-
},
201-
Some(JavaScriptCode) => read_string(reader).map(Bson::JavaScriptCode),
202-
Some(JavaScriptCodeWithScope) => {
203-
let code = try!(read_string(reader));
204-
let scope = try!(decode_document(reader));
205-
Ok(Bson::JavaScriptCodeWithScope(code, scope))
206-
},
207-
Some(Deprecated) => Ok(Bson::Deprecated),
208-
Some(Integer32Bit) => read_i32(reader).map(Bson::I32),
209-
Some(Integer64Bit) => read_i64(reader).map(Bson::I64),
210-
Some(TimeStamp) => read_i64(reader).map(Bson::TimeStamp),
211-
Some(UtcDatetime) => {
212-
let time = try!(read_i64(reader));
213-
Ok(Bson::UtcDatetime(DateTime::from_utc(NaiveDateTime::from_timestamp(time, 0), UTC)))
214-
},
215-
Some(Undefined) |
216-
Some(DbPointer) |
217-
Some(MaxKey) |
218-
Some(MinKey) |
219-
None => Err(DecoderError::UnrecognizedElementType(tag))
220-
}
174+
use spec::ElementType::*;
175+
match spec::ElementType::from(tag) {
176+
Some(FloatingPoint) => {
177+
Ok(Bson::FloatingPoint(try!(reader.read_f64::<LittleEndian>())))
178+
},
179+
Some(Utf8String) => read_string(reader).map(Bson::String),
180+
Some(EmbeddedDocument) => decode_document(reader).map(Bson::Document),
181+
Some(Array) => decode_array(reader).map(Bson::Array),
182+
Some(Binary) => {
183+
let len = try!(read_i32(reader));
184+
let subtype = BinarySubtype::from(try!(reader.read_u8()));
185+
let mut data = Vec::with_capacity(len as usize);
186+
try!(reader.take(len as u64).read_to_end(&mut data));
187+
Ok(Bson::Binary(subtype, data))
188+
}
189+
Some(ObjectId) => {
190+
let mut objid = [0; 12];
191+
for x in &mut objid {
192+
*x = try!(reader.read_u8());
193+
}
194+
Ok(Bson::ObjectId(objid))
195+
}
196+
Some(Boolean) => Ok(Bson::Boolean(try!(reader.read_u8()) != 0)),
197+
Some(NullValue) => Ok(Bson::Null),
198+
Some(RegularExpression) => {
199+
let pat = try!(read_cstring(reader));
200+
let opt = try!(read_cstring(reader));
201+
Ok(Bson::RegExp(pat, opt))
202+
},
203+
Some(JavaScriptCode) => read_string(reader).map(Bson::JavaScriptCode),
204+
Some(JavaScriptCodeWithScope) => {
205+
let code = try!(read_string(reader));
206+
let scope = try!(decode_document(reader));
207+
Ok(Bson::JavaScriptCodeWithScope(code, scope))
208+
},
209+
Some(Deprecated) => Ok(Bson::Deprecated),
210+
Some(Integer32Bit) => read_i32(reader).map(Bson::I32),
211+
Some(Integer64Bit) => read_i64(reader).map(Bson::I64),
212+
Some(TimeStamp) => read_i64(reader).map(Bson::TimeStamp),
213+
Some(UtcDatetime) => {
214+
let time = try!(read_i64(reader));
215+
Ok(Bson::UtcDatetime(DateTime::from_utc(NaiveDateTime::from_timestamp(time, 0), UTC)))
216+
},
217+
Some(Undefined) |
218+
Some(DbPointer) |
219+
Some(MaxKey) |
220+
Some(MinKey) |
221+
None => Err(DecoderError::UnrecognizedElementType(tag))
222+
}
221223
}

0 commit comments

Comments
 (0)