22
22
//! Encoder
23
23
24
24
use std:: io:: { self , Write } ;
25
+ use std:: iter:: IntoIterator ;
25
26
use std:: { mem, error, fmt} ;
26
27
27
28
use byteorder:: { self , LittleEndian , WriteBytesExt } ;
28
29
29
- use bson:: { Array , Document , Bson } ;
30
+ use bson:: Bson ;
30
31
31
32
#[ derive( Debug ) ]
32
33
pub enum EncoderError {
@@ -96,7 +97,7 @@ fn write_f64<W: Write + ?Sized>(writer: &mut W, val: f64) -> EncoderResult<()> {
96
97
writer. write_f64 :: < LittleEndian > ( val) . map_err ( From :: from)
97
98
}
98
99
99
- fn encode_array < W : Write + ?Sized > ( writer : & mut W , arr : & Array ) -> EncoderResult < ( ) > {
100
+ fn encode_array < W : Write + ?Sized > ( writer : & mut W , arr : & [ Bson ] ) -> EncoderResult < ( ) > {
100
101
let mut buf = Vec :: new ( ) ;
101
102
for ( key, val) in arr. iter ( ) . enumerate ( ) {
102
103
try!( encode_bson ( & mut buf, & key. to_string ( ) , val) ) ;
@@ -108,9 +109,12 @@ fn encode_array<W: Write + ?Sized>(writer: &mut W, arr: &Array) -> EncoderResult
108
109
Ok ( ( ) )
109
110
}
110
111
111
- pub fn encode_document < ' a , W : Write + ?Sized > ( writer : & mut W , doc : & Document ) -> EncoderResult < ( ) > {
112
+ pub fn encode_document
113
+ < ' a , W : Write + ?Sized , D : IntoIterator < Item =( & ' a String , & ' a Bson ) > >
114
+ ( writer : & mut W , doc : D ) -> EncoderResult < ( ) >
115
+ {
112
116
let mut buf = Vec :: new ( ) ;
113
- for ( key, val) in doc. iter ( ) {
117
+ for ( key, val) in doc. into_iter ( ) {
114
118
try!( encode_bson ( & mut buf, key, val) ) ;
115
119
}
116
120
@@ -128,7 +132,7 @@ fn encode_bson<W: Write + ?Sized>(writer: &mut W, key: &str, val: &Bson) -> Enco
128
132
& Bson :: FloatingPoint ( v) => write_f64 ( writer, v) ,
129
133
& Bson :: String ( ref v) => write_string ( writer, & v) ,
130
134
& Bson :: Array ( ref v) => encode_array ( writer, & v) ,
131
- & Bson :: Document ( ref v) => encode_document ( writer, & v) ,
135
+ & Bson :: Document ( ref v) => encode_document ( writer, v) ,
132
136
& Bson :: Boolean ( v) => writer. write_u8 ( if v { 0x00 } else { 0x01 } ) . map_err ( From :: from) ,
133
137
& Bson :: RegExp ( ref pat, ref opt) => {
134
138
try!( write_cstring ( writer, pat) ) ;
0 commit comments