1use std::str::FromStr;
7use rustc_serialize as serialize;
8use error::{Result, Error};
9use std::slice::Iter;
10
11pub struct BytesColumns<'a> {
13 pos: usize,
14 line: &'a [u8],
15 iter: Iter<'a, usize>,
16}
17
18impl<'a> Iterator for BytesColumns<'a> {
19 type Item = &'a [u8];
20
21 fn next(&mut self) -> Option<&'a [u8]> {
22 self.iter.next().map(|p| {
23 let s = &self.line[self.pos..*p];
24 self.pos = *p + 1;
25 if s.starts_with(&[b'\"']) { &s[1..s.len() - 1] } else { s }
26 })
27 }
28
29 fn size_hint(&self) -> (usize, Option<usize>) {
30 self.iter.size_hint()
31 }
32
33}
34
35impl<'a> ExactSizeIterator for BytesColumns<'a> {
36 fn len(&self) -> usize {
37 self.iter.len()
38 }
39}
40
41impl<'a> BytesColumns<'a> {
42
43 pub fn new(line: &'a [u8], cols: &'a [usize]) -> BytesColumns<'a> {
45 BytesColumns {
46 pos: 0,
47 line: line,
48 iter: cols.iter(),
49 }
50 }
51
52}
53
54pub struct Columns<'a> {
56 pos: usize,
57 line: &'a str,
58 iter: Iter<'a, usize>,
59}
60
61impl<'a> Iterator for Columns<'a> {
62 type Item = &'a str;
63
64 fn next(&mut self) -> Option<&'a str> {
65 self.iter.next().map(|p| {
66 let s = &self.line[self.pos..*p];
67 self.pos = *p + 1;
68 if s.starts_with('\"') { &s[1..s.len() - 1] } else { s }
69 })
70 }
71
72 fn size_hint(&self) -> (usize, Option<usize>) {
73 self.iter.size_hint()
74 }
75
76}
77
78impl<'a> ExactSizeIterator for Columns<'a> {
79 fn len(&self) -> usize {
80 self.iter.len()
81 }
82}
83
84impl<'a> Columns<'a> {
85
86 pub fn new(line: &'a str, cols: &'a [usize]) -> Columns<'a> {
88 Columns {
89 pos: 0,
90 line: line,
91 iter: cols.iter(),
92 }
93 }
94
95 fn peek(&self) -> Option<&'a str> {
96 self.iter.clone().next().map(|p| {
97 let s = &self.line[self.pos..*p];
98 if s.starts_with('\"') { &s[1..s.len() - 1] } else { s }
99 })
100 }
101
102 fn next_str<T>(&mut self) -> Result<T>
103 where T: FromStr + ::std::fmt::Debug,
104 T::Err: ::std::fmt::Debug
105 {
106 self.next().ok_or(Error::EOL).and_then(|col|
107 FromStr::from_str(col).map_err(|e|
108 Error::Decode(format!("Failed converting {}th column (\'{}\'):\n\t{:?}",
109 self.len(), col, e))))
110 }
111
112 pub fn decode<T: serialize::Decodable>(&mut self) -> Result<T> {
114 serialize::Decodable::decode(self)
115 }
116
117}
118
119impl<'a> serialize::Decoder for Columns<'a> {
120 type Error = Error;
121
122 fn error(&mut self, err: &str) -> Error {
123 Error::Decode(err.into())
124 }
125 fn read_nil(&mut self) -> Result<()> { unimplemented!() }
126 fn read_usize(&mut self) -> Result<usize> { self.next_str() }
127 fn read_u64(&mut self) -> Result<u64> { self.next_str() }
128 fn read_u32(&mut self) -> Result<u32> { self.next_str() }
129 fn read_u16(&mut self) -> Result<u16> { self.next_str() }
130 fn read_u8(&mut self) -> Result<u8> { self.next_str() }
131 fn read_isize(&mut self) -> Result<isize> { self.next_str() }
132 fn read_i64(&mut self) -> Result<i64> { self.next_str() }
133 fn read_i32(&mut self) -> Result<i32> { self.next_str() }
134 fn read_i16(&mut self) -> Result<i16> { self.next_str() }
135 fn read_i8(&mut self) -> Result<i8> { self.next_str() }
136 fn read_bool(&mut self) -> Result<bool> { self.next_str() }
137 fn read_f64(&mut self) -> Result<f64> { self.next_str() }
138 fn read_f32(&mut self) -> Result<f32> { self.next_str() }
139 fn read_char(&mut self) -> Result<char> {
140 let col = try!(self.next().ok_or(Error::EOL));
141 if col.len() != 1 {
142 return Err(Error::Decode(format!(
143 "Expected a single char, found {} chars", col.len())));
144 }
145 Ok(col.chars().next().unwrap())
146 }
147 fn read_str(&mut self) -> Result<String> { self.next_str() }
148 fn read_enum<T, F>(&mut self, _: &str, f: F) -> Result<T>
149 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
150 f(self)
151 }
152
153 fn read_enum_variant<T, F>(&mut self, names: &[&str], mut f: F) -> Result<T>
154 where F: FnMut(&mut Columns<'a>, usize) -> Result<T> {
155 let i = try!(self
156 .peek()
157 .and_then(|name| names.iter().position(|&n| n == name))
158 .ok_or(Error::Decode(format!(
159 "Could not load value into any variant in {:?}", names))));
160 let _ = self.next();
161 f(self, i)
162 }
163
164 fn read_enum_variant_arg<T, F>(&mut self, _: usize, f: F) -> Result<T>
165 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
166 f(self)
167 }
168 fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> Result<T>
169 where F: FnMut(&mut Columns<'a>, usize) -> Result<T> {
170 self.read_enum_variant(names, f)
171 }
172 fn read_enum_struct_variant_field<T, F>(&mut self, _: &str,
173 f_idx: usize, f: F) -> Result<T>
174 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
175 self.read_enum_variant_arg(f_idx, f)
176 }
177 fn read_struct<T, F>(&mut self, _: &str, _: usize, f: F) -> Result<T>
178 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
179 f(self)
180 }
181 fn read_struct_field<T, F>(&mut self, _: &str, _: usize, f: F) -> Result<T>
182 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
183 f(self)
184 }
185 fn read_tuple<T, F>(&mut self, _: usize, f: F) -> Result<T>
186 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
187 f(self)
188 }
189 fn read_tuple_arg<T, F>(&mut self, _: usize, f: F) -> Result<T>
190 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
191 f(self)
192 }
193 fn read_tuple_struct<T, F>(&mut self, _: &str, _: usize, _: F) -> Result<T>
194 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
195 unimplemented!()
196 }
197 fn read_tuple_struct_arg<T, F>(&mut self, _: usize, _: F) -> Result<T>
198 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
199 unimplemented!()
200 }
201
202 fn read_option<T, F>(&mut self, mut f: F) -> Result<T>
203 where F: FnMut(&mut Columns<'a>, bool) -> Result<T> {
204 let col = try!(self.peek().ok_or(Error::EOL));
205 if col.is_empty() {
206 let _ = self.iter.next();
207 f(self, false)
208 } else {
209 f(self, true).or_else(|_| f(self, false))
210 }
211 }
212
213 fn read_seq<T, F>(&mut self, f: F) -> Result<T>
214 where F: FnOnce(&mut Columns<'a>, usize) -> Result<T> {
215 let len = self.iter.clone().count();
216 f(self, len)
217 }
218 fn read_seq_elt<T, F>(&mut self, _: usize, f: F) -> Result<T>
219 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
220 f(self)
221 }
222 fn read_map<T, F>(&mut self, _: F) -> Result<T>
223 where F: FnOnce(&mut Columns<'a>, usize) -> Result<T> {
224 unimplemented!()
225 }
226 fn read_map_elt_key<T, F>(&mut self, _: usize, _: F) -> Result<T>
227 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
228 unimplemented!()
229 }
230 fn read_map_elt_val<T, F>(&mut self, _: usize, _: F) -> Result<T>
231 where F: FnOnce(&mut Columns<'a>) -> Result<T> {
232 unimplemented!()
233 }
234}