1 use serde::de::value::BorrowedStrDeserializer;
2 use serde::de::{self, DeserializeOwned, DeserializeSeed, SeqAccess, Visitor};
3 use serde::{self, forward_to_deserialize_any, Deserialize};
4 use std::marker::PhantomData;
5 use std::{fmt, slice, str};
6 
7 use super::{CellErrorType, CellType, DataType, Range, Rows};
8 
9 /// A cell deserialization specific error enum
10 #[derive(Debug)]
11 pub enum DeError {
12     /// Cell out of range
13     CellOutOfRange {
14         /// Position tried
15         try_pos: (u32, u32),
16         /// Minimum position
17         min_pos: (u32, u32),
18     },
19     /// The cell value is an error
20     CellError {
21         /// Cell value error
22         err: CellErrorType,
23         /// Cell position
24         pos: (u32, u32),
25     },
26     /// Unexpected end of row
27     UnexpectedEndOfRow {
28         /// Cell position
29         pos: (u32, u32),
30     },
31     /// Required header not found
32     HeaderNotFound(String),
33     /// Serde specific error
34     Custom(String),
35 }
36 
37 impl fmt::Display for DeError {
fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error>38     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
39         match *self {
40             DeError::CellOutOfRange {
41                 ref try_pos,
42                 ref min_pos,
43             } => write!(
44                 f,
45                 "there is no cell at position '{:?}'.Minimum position is '{:?}'",
46                 try_pos, min_pos
47             ),
48             DeError::CellError { ref pos, ref err } => {
49                 write!(f, "Cell error at position '{:?}': {}", pos, err)
50             }
51             DeError::UnexpectedEndOfRow { ref pos } => {
52                 write!(f, "Unexpected end of row at position '{:?}'", pos)
53             }
54             DeError::HeaderNotFound(ref header) => {
55                 write!(f, "Cannot find header named '{}'", header)
56             }
57             DeError::Custom(ref s) => write!(f, "{}", s),
58         }
59     }
60 }
61 
62 impl std::error::Error for DeError {
source(&self) -> Option<&(dyn std::error::Error + 'static)>63     fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
64         None
65     }
66 }
67 
68 impl de::Error for DeError {
custom<T: fmt::Display>(msg: T) -> Self69     fn custom<T: fmt::Display>(msg: T) -> Self {
70         DeError::Custom(msg.to_string())
71     }
72 }
73 
74 #[derive(Clone)]
75 pub enum Headers<'h, H> {
76     None,
77     All,
78     Custom(&'h [H]),
79 }
80 
81 /// Builds a `Range` deserializer with some configuration options.
82 ///
83 /// This can be used to optionally parse the first row as a header. Once built,
84 /// a `RangeDeserializer`s cannot be changed.
85 #[derive(Clone)]
86 pub struct RangeDeserializerBuilder<'h, H> {
87     headers: Headers<'h, H>,
88 }
89 
90 impl Default for RangeDeserializerBuilder<'static, &'static str> {
default() -> Self91     fn default() -> Self {
92         RangeDeserializerBuilder {
93             headers: Headers::All,
94         }
95     }
96 }
97 
98 impl RangeDeserializerBuilder<'static, &'static str> {
99     /// Constructs a new builder for configuring `Range` deserialization.
new() -> Self100     pub fn new() -> Self {
101         Default::default()
102     }
103 
104     /// Decide whether to treat the first row as a special header row.
105     ///
106     /// # Example
107     ///
108     /// ```
109     /// # use calamine::{DataType, Error, open_workbook, Xlsx, Reader, RangeDeserializerBuilder};
110     /// fn example() -> Result<(), Error> {
111     ///     let path = format!("{}/tests/temperature.xlsx", env!("CARGO_MANIFEST_DIR"));
112     ///     let mut workbook: Xlsx<_> = open_workbook(path)?;
113     ///     let range = workbook.worksheet_range("Sheet1")
114     ///         .ok_or(Error::Msg("Cannot find 'Sheet1'"))??;
115     ///
116     ///     let mut iter = RangeDeserializerBuilder::new()
117     ///         .has_headers(false)
118     ///         .from_range(&range)?;
119     ///
120     ///     if let Some(result) = iter.next() {
121     ///         let row: Vec<DataType> = result?;
122     ///         assert_eq!(row, [DataType::from("label"), DataType::from("value")]);
123     ///     } else {
124     ///         return Err(From::from("expected at least three records but got none"));
125     ///     }
126     ///
127     ///     if let Some(result) = iter.next() {
128     ///         let row: Vec<DataType> = result?;
129     ///         assert_eq!(row, [DataType::from("celsius"), DataType::from(22.2222)]);
130     ///     } else {
131     ///         return Err(From::from("expected at least three records but got one"));
132     ///     }
133     ///
134     ///     Ok(())
135     /// }
136     /// ```
has_headers(&mut self, yes: bool) -> &mut Self137     pub fn has_headers(&mut self, yes: bool) -> &mut Self {
138         if yes {
139             self.headers = Headers::All;
140         } else {
141             self.headers = Headers::None;
142         }
143         self
144     }
145 }
146 
147 impl<'h, H: AsRef<str> + Clone + 'h> RangeDeserializerBuilder<'h, H> {
148     /// Build a `RangeDeserializer` from this configuration and keep only selected headers.
149     ///
150     /// # Example
151     ///
152     /// ```
153     /// # use calamine::{open_workbook, Error, Xlsx, Reader, RangeDeserializerBuilder};
154     /// fn example() -> Result<(), Error> {
155     ///     let path = format!("{}/tests/temperature.xlsx", env!("CARGO_MANIFEST_DIR"));
156     ///     let mut workbook: Xlsx<_> = open_workbook(path)?;
157     ///     let range = workbook.worksheet_range("Sheet1")
158     ///         .ok_or(Error::Msg("Cannot find 'Sheet1'"))??;
159     ///     let mut iter = RangeDeserializerBuilder::with_headers(&["value", "label"]).from_range(&range)?;
160     ///
161     ///     if let Some(result) = iter.next() {
162     ///         let (value, label): (f64, String) = result?;
163     ///         assert_eq!(label, "celsius");
164     ///         assert_eq!(value, 22.2222);
165     ///
166     ///         Ok(())
167     ///     } else {
168     ///         return Err(From::from("expected at least one record but got none"));
169     ///     }
170     /// }
171     /// ```
with_headers(headers: &'h [H]) -> Self172     pub fn with_headers(headers: &'h [H]) -> Self {
173         RangeDeserializerBuilder {
174             headers: Headers::Custom(headers),
175         }
176     }
177 
178     /// Build a `RangeDeserializer` from this configuration.
179     ///
180     /// # Example
181     ///
182     /// ```
183     /// # use calamine::{open_workbook, Error, Xlsx, Reader, RangeDeserializerBuilder};
184     /// fn example() -> Result<(), Error> {
185     ///     let path = format!("{}/tests/temperature.xlsx", env!("CARGO_MANIFEST_DIR"));
186     ///     let mut workbook: Xlsx<_> = open_workbook(path)?;
187     ///     let range = workbook.worksheet_range("Sheet1")
188     ///         .ok_or(Error::Msg("Cannot find 'Sheet1'"))??;
189     ///     let mut iter = RangeDeserializerBuilder::new().from_range(&range)?;
190     ///
191     ///     if let Some(result) = iter.next() {
192     ///         let (label, value): (String, f64) = result?;
193     ///         assert_eq!(label, "celsius");
194     ///         assert_eq!(value, 22.2222);
195     ///
196     ///         Ok(())
197     ///     } else {
198     ///         return Err(From::from("expected at least one record but got none"));
199     ///     }
200     /// }
201     /// ```
from_range<'cell, T, D>( &self, range: &'cell Range<T>, ) -> Result<RangeDeserializer<'cell, T, D>, DeError> where T: ToCellDeserializer<'cell>, D: DeserializeOwned,202     pub fn from_range<'cell, T, D>(
203         &self,
204         range: &'cell Range<T>,
205     ) -> Result<RangeDeserializer<'cell, T, D>, DeError>
206     where
207         T: ToCellDeserializer<'cell>,
208         D: DeserializeOwned,
209     {
210         RangeDeserializer::new(self, range)
211     }
212 }
213 
214 /// A configured `Range` deserializer.
215 ///
216 /// # Example
217 ///
218 /// ```
219 /// # use calamine::{open_workbook, Error, Xlsx, Reader, RangeDeserializerBuilder};
220 /// fn example() -> Result<(), Error> {
221 ///     let path = format!("{}/tests/temperature.xlsx", env!("CARGO_MANIFEST_DIR"));
222 ///     let mut workbook: Xlsx<_> = open_workbook(path)?;
223 ///     let range = workbook.worksheet_range("Sheet1")
224 ///         .ok_or(Error::Msg("Cannot find 'Sheet1'"))??;
225 ///
226 ///     let mut iter = RangeDeserializerBuilder::new().from_range(&range)?;
227 ///
228 ///     if let Some(result) = iter.next() {
229 ///         let (label, value): (String, f64) = result?;
230 ///         assert_eq!(label, "celsius");
231 ///         assert_eq!(value, 22.2222);
232 ///         Ok(())
233 ///     } else {
234 ///         Err(From::from("expected at least one record but got none"))
235 ///     }
236 /// }
237 /// ```
238 pub struct RangeDeserializer<'cell, T, D>
239 where
240     T: ToCellDeserializer<'cell>,
241     D: DeserializeOwned,
242 {
243     column_indexes: Vec<usize>,
244     headers: Option<Vec<String>>,
245     rows: Rows<'cell, T>,
246     current_pos: (u32, u32),
247     end_pos: (u32, u32),
248     _priv: PhantomData<D>,
249 }
250 
251 impl<'cell, T, D> RangeDeserializer<'cell, T, D>
252 where
253     T: ToCellDeserializer<'cell>,
254     D: DeserializeOwned,
255 {
new<'h, H: AsRef<str> + Clone + 'h>( builder: &RangeDeserializerBuilder<'h, H>, range: &'cell Range<T>, ) -> Result<Self, DeError>256     fn new<'h, H: AsRef<str> + Clone + 'h>(
257         builder: &RangeDeserializerBuilder<'h, H>,
258         range: &'cell Range<T>,
259     ) -> Result<Self, DeError> {
260         let mut rows = range.rows();
261 
262         let mut current_pos = range.start().unwrap_or((0, 0));
263         let end_pos = range.end().unwrap_or((0, 0));
264 
265         let (column_indexes, headers) = match builder.headers {
266             Headers::None => ((0..range.width()).collect(), None),
267             Headers::All => {
268                 if let Some(row) = rows.next() {
269                     let all_indexes = (0..row.len()).collect::<Vec<_>>();
270                     let all_headers = {
271                         let de = RowDeserializer::new(&all_indexes, None, row, current_pos);
272                         current_pos.0 += 1;
273                         Deserialize::deserialize(de)?
274                     };
275                     (all_indexes, Some(all_headers))
276                 } else {
277                     (Vec::new(), None)
278                 }
279             }
280             Headers::Custom(headers) => {
281                 if let Some(row) = rows.next() {
282                     let all_indexes = (0..row.len()).collect::<Vec<_>>();
283                     let de = RowDeserializer::new(&all_indexes, None, row, current_pos);
284                     current_pos.0 += 1;
285                     let all_headers: Vec<String> = Deserialize::deserialize(de)?;
286                     let custom_indexes = headers
287                         .iter()
288                         .map(|h| h.as_ref().trim())
289                         .map(|h| {
290                             all_headers
291                                 .iter()
292                                 .position(|header| header.trim() == h)
293                                 .ok_or_else(|| DeError::HeaderNotFound(h.to_owned()))
294                         })
295                         .collect::<Result<Vec<_>, DeError>>()?;
296                     (custom_indexes, Some(all_headers))
297                 } else {
298                     (Vec::new(), None)
299                 }
300             }
301         };
302 
303         Ok(RangeDeserializer {
304             column_indexes,
305             headers,
306             rows,
307             current_pos,
308             end_pos,
309             _priv: PhantomData,
310         })
311     }
312 }
313 
314 impl<'cell, T, D> Iterator for RangeDeserializer<'cell, T, D>
315 where
316     T: ToCellDeserializer<'cell>,
317     D: DeserializeOwned,
318 {
319     type Item = Result<D, DeError>;
320 
next(&mut self) -> Option<Self::Item>321     fn next(&mut self) -> Option<Self::Item> {
322         let RangeDeserializer {
323             ref column_indexes,
324             ref headers,
325             ref mut rows,
326             mut current_pos,
327             ..
328         } = *self;
329 
330         if let Some(row) = rows.next() {
331             current_pos.0 += 1;
332             let headers = headers.as_ref().map(|h| &**h);
333             let de = RowDeserializer::new(column_indexes, headers, row, current_pos);
334             Some(Deserialize::deserialize(de))
335         } else {
336             None
337         }
338     }
339 
size_hint(&self) -> (usize, Option<usize>)340     fn size_hint(&self) -> (usize, Option<usize>) {
341         let remaining = (self.end_pos.0 - self.current_pos.0) as usize;
342 
343         (remaining, Some(remaining))
344     }
345 }
346 
347 struct RowDeserializer<'header, 'cell, T>
348 where
349     T: ToCellDeserializer<'cell>,
350 {
351     cells: &'cell [T],
352     headers: Option<&'header [String]>,
353     iter: slice::Iter<'header, usize>, // iterator over column indexes
354     peek: Option<usize>,
355     pos: (u32, u32),
356 }
357 
358 impl<'header, 'cell, T> RowDeserializer<'header, 'cell, T>
359 where
360     T: 'cell + ToCellDeserializer<'cell>,
361 {
new( column_indexes: &'header [usize], headers: Option<&'header [String]>, cells: &'cell [T], pos: (u32, u32), ) -> Self362     fn new(
363         column_indexes: &'header [usize],
364         headers: Option<&'header [String]>,
365         cells: &'cell [T],
366         pos: (u32, u32),
367     ) -> Self {
368         RowDeserializer {
369             iter: column_indexes.iter(),
370             headers,
371             cells,
372             pos,
373             peek: None,
374         }
375     }
376 
has_headers(&self) -> bool377     fn has_headers(&self) -> bool {
378         self.headers.is_some()
379     }
380 }
381 
382 impl<'de, 'header, 'cell, T> serde::Deserializer<'de> for RowDeserializer<'header, 'cell, T>
383 where
384     'header: 'de,
385     'cell: 'de,
386     T: 'cell + ToCellDeserializer<'cell>,
387 {
388     type Error = DeError;
389 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,390     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
391     where
392         V: Visitor<'de>,
393     {
394         visitor.visit_seq(self)
395     }
396 
deserialize_map<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>397     fn deserialize_map<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
398         if !self.has_headers() {
399             visitor.visit_seq(self)
400         } else {
401             visitor.visit_map(self)
402         }
403     }
404 
deserialize_struct<V: Visitor<'de>>( self, _name: &'static str, _cells: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>405     fn deserialize_struct<V: Visitor<'de>>(
406         self,
407         _name: &'static str,
408         _cells: &'static [&'static str],
409         visitor: V,
410     ) -> Result<V::Value, Self::Error> {
411         if !self.has_headers() {
412             visitor.visit_seq(self)
413         } else {
414             visitor.visit_map(self)
415         }
416     }
417 
418     forward_to_deserialize_any! {
419         bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
420         byte_buf option unit unit_struct newtype_struct seq tuple
421         tuple_struct enum identifier ignored_any
422     }
423 }
424 
425 impl<'de, 'header, 'cell, T> SeqAccess<'de> for RowDeserializer<'header, 'cell, T>
426 where
427     'header: 'de,
428     'cell: 'de,
429     T: ToCellDeserializer<'cell>,
430 {
431     type Error = DeError;
432 
next_element_seed<D>(&mut self, seed: D) -> Result<Option<D::Value>, Self::Error> where D: DeserializeSeed<'de>,433     fn next_element_seed<D>(&mut self, seed: D) -> Result<Option<D::Value>, Self::Error>
434     where
435         D: DeserializeSeed<'de>,
436     {
437         match self.iter.next().map(|i| &self.cells[*i]) {
438             Some(value) => {
439                 let de = value.to_cell_deserializer(self.pos);
440                 seed.deserialize(de).map(Some)
441             }
442             None => Ok(None),
443         }
444     }
445 
size_hint(&self) -> Option<usize>446     fn size_hint(&self) -> Option<usize> {
447         match self.iter.size_hint() {
448             (lower, Some(upper)) if lower == upper => Some(upper),
449             _ => None,
450         }
451     }
452 }
453 
454 impl<'de, 'header: 'de, 'cell: 'de, T> de::MapAccess<'de> for RowDeserializer<'header, 'cell, T>
455 where
456     'header: 'de,
457     'cell: 'de,
458     T: ToCellDeserializer<'cell>,
459 {
460     type Error = DeError;
461 
next_key_seed<K: DeserializeSeed<'de>>( &mut self, seed: K, ) -> Result<Option<K::Value>, Self::Error>462     fn next_key_seed<K: DeserializeSeed<'de>>(
463         &mut self,
464         seed: K,
465     ) -> Result<Option<K::Value>, Self::Error> {
466         let headers = self
467             .headers
468             .expect("Cannot map-deserialize range without headers");
469 
470         while let Some(i) = self.iter.next() {
471             if !self.cells[*i].is_empty() {
472                 self.peek = Some(*i);
473                 let de = BorrowedStrDeserializer::<Self::Error>::new(&headers[*i]);
474                 return seed.deserialize(de).map(Some);
475             }
476         }
477         Ok(None)
478     }
479 
next_value_seed<K: DeserializeSeed<'de>>( &mut self, seed: K, ) -> Result<K::Value, Self::Error>480     fn next_value_seed<K: DeserializeSeed<'de>>(
481         &mut self,
482         seed: K,
483     ) -> Result<K::Value, Self::Error> {
484         let cell = self
485             .peek
486             .take()
487             .map(|i| &self.cells[i])
488             .ok_or(DeError::UnexpectedEndOfRow { pos: self.pos })?;
489         let de = cell.to_cell_deserializer(self.pos);
490         seed.deserialize(de)
491     }
492 }
493 
494 /// Constructs a deserializer for a `CellType`.
495 pub trait ToCellDeserializer<'a>: CellType {
496     /// The deserializer.
497     type Deserializer: for<'de> serde::Deserializer<'de, Error = DeError>;
498 
499     /// Construct a `CellType` deserializer at the specified position.
to_cell_deserializer(&'a self, pos: (u32, u32)) -> Self::Deserializer500     fn to_cell_deserializer(&'a self, pos: (u32, u32)) -> Self::Deserializer;
501 
502     /// Assess if the cell is empty.
is_empty(&self) -> bool503     fn is_empty(&self) -> bool;
504 }
505 
506 impl<'a> ToCellDeserializer<'a> for DataType {
507     type Deserializer = DataTypeDeserializer<'a>;
508 
to_cell_deserializer(&'a self, pos: (u32, u32)) -> DataTypeDeserializer<'a>509     fn to_cell_deserializer(&'a self, pos: (u32, u32)) -> DataTypeDeserializer<'a> {
510         DataTypeDeserializer {
511             data_type: self,
512             pos,
513         }
514     }
515 
516     #[inline]
is_empty(&self) -> bool517     fn is_empty(&self) -> bool {
518         if let DataType::Empty = self {
519             true
520         } else {
521             false
522         }
523     }
524 }
525 
526 macro_rules! deserialize_num {
527     ($typ:ty, $method:ident, $visit:ident) => {
528         fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
529         where
530             V: Visitor<'de>,
531         {
532             match self.data_type {
533                 DataType::Float(v) => visitor.$visit(*v as $typ),
534                 DataType::Int(v) => visitor.$visit(*v as $typ),
535                 DataType::String(ref s) => {
536                     let v = s.parse().map_err(|_| {
537                         DeError::Custom(format!("Expecting {}, got '{}'", stringify!($typ), s))
538                     })?;
539                     visitor.$visit(v)
540                 }
541                 DataType::Error(ref err) => Err(DeError::CellError {
542                     err: err.clone(),
543                     pos: self.pos,
544                 }),
545                 ref d => Err(DeError::Custom(format!(
546                     "Expecting {}, got {:?}",
547                     stringify!($typ),
548                     d
549                 ))),
550             }
551         }
552     };
553 }
554 
555 /// A deserializer for the `DataType` type.
556 pub struct DataTypeDeserializer<'a> {
557     data_type: &'a DataType,
558     pos: (u32, u32),
559 }
560 
561 impl<'a, 'de> serde::Deserializer<'de> for DataTypeDeserializer<'a> {
562     type Error = DeError;
563 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,564     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
565     where
566         V: Visitor<'de>,
567     {
568         match self.data_type {
569             DataType::String(v) => visitor.visit_str(v),
570             DataType::Float(v) => visitor.visit_f64(*v),
571             DataType::Bool(v) => visitor.visit_bool(*v),
572             DataType::Int(v) => visitor.visit_i64(*v),
573             DataType::Empty => visitor.visit_unit(),
574             DataType::Error(ref err) => Err(DeError::CellError {
575                 err: err.clone(),
576                 pos: self.pos,
577             }),
578         }
579     }
580 
deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,581     fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
582     where
583         V: Visitor<'de>,
584     {
585         match self.data_type {
586             DataType::String(v) => visitor.visit_str(v),
587             DataType::Empty => visitor.visit_str(""),
588             DataType::Float(v) => visitor.visit_str(&v.to_string()),
589             DataType::Int(v) => visitor.visit_str(&v.to_string()),
590             DataType::Bool(v) => visitor.visit_str(&v.to_string()),
591             DataType::Error(ref err) => Err(DeError::CellError {
592                 err: err.clone(),
593                 pos: self.pos,
594             }),
595         }
596     }
597 
deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,598     fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
599     where
600         V: Visitor<'de>,
601     {
602         match self.data_type {
603             DataType::String(v) => visitor.visit_bytes(v.as_bytes()),
604             DataType::Empty => visitor.visit_bytes(&[]),
605             DataType::Error(ref err) => Err(DeError::CellError {
606                 err: err.clone(),
607                 pos: self.pos,
608             }),
609             ref d => Err(DeError::Custom(format!("Expecting bytes, got {:?}", d))),
610         }
611     }
612 
deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,613     fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
614     where
615         V: Visitor<'de>,
616     {
617         self.deserialize_bytes(visitor)
618     }
619 
deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,620     fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
621     where
622         V: Visitor<'de>,
623     {
624         self.deserialize_str(visitor)
625     }
626 
deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,627     fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
628     where
629         V: Visitor<'de>,
630     {
631         match self.data_type {
632             DataType::Bool(v) => visitor.visit_bool(*v),
633             DataType::String(ref v) => match &**v {
634                 "TRUE" | "true" | "True" => visitor.visit_bool(true),
635                 "FALSE" | "false" | "False" => visitor.visit_bool(false),
636                 d => Err(DeError::Custom(format!("Expecting bool, got '{}'", d))),
637             },
638             DataType::Empty => visitor.visit_bool(false),
639             DataType::Float(v) => visitor.visit_bool(*v != 0.),
640             DataType::Int(v) => visitor.visit_bool(*v != 0),
641             DataType::Error(ref err) => Err(DeError::CellError {
642                 err: err.clone(),
643                 pos: self.pos,
644             }),
645         }
646     }
647 
deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,648     fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
649     where
650         V: Visitor<'de>,
651     {
652         match self.data_type {
653             DataType::String(ref s) if s.len() == 1 => {
654                 visitor.visit_char(s.chars().next().expect("s not empty"))
655             }
656             DataType::Error(ref err) => Err(DeError::CellError {
657                 err: err.clone(),
658                 pos: self.pos,
659             }),
660             ref d => Err(DeError::Custom(format!("Expecting unit, got {:?}", d))),
661         }
662     }
663 
deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,664     fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
665     where
666         V: Visitor<'de>,
667     {
668         match self.data_type {
669             DataType::Empty => visitor.visit_unit(),
670             DataType::Error(ref err) => Err(DeError::CellError {
671                 err: err.clone(),
672                 pos: self.pos,
673             }),
674             ref d => Err(DeError::Custom(format!("Expecting unit, got {:?}", d))),
675         }
676     }
677 
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,678     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
679     where
680         V: Visitor<'de>,
681     {
682         match self.data_type {
683             DataType::Empty => visitor.visit_none(),
684             _ => visitor.visit_some(self),
685         }
686     }
687 
deserialize_newtype_struct<V>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>,688     fn deserialize_newtype_struct<V>(
689         self,
690         _name: &'static str,
691         visitor: V,
692     ) -> Result<V::Value, Self::Error>
693     where
694         V: Visitor<'de>,
695     {
696         visitor.visit_newtype_struct(self)
697     }
698 
699     deserialize_num!(i64, deserialize_i64, visit_i64);
700     deserialize_num!(i32, deserialize_i32, visit_i32);
701     deserialize_num!(i16, deserialize_i16, visit_i16);
702     deserialize_num!(i8, deserialize_i8, visit_i8);
703     deserialize_num!(u64, deserialize_u64, visit_u64);
704     deserialize_num!(u32, deserialize_u32, visit_u32);
705     deserialize_num!(u16, deserialize_u16, visit_u16);
706     deserialize_num!(u8, deserialize_u8, visit_u8);
707     deserialize_num!(f64, deserialize_f64, visit_f64);
708     deserialize_num!(f32, deserialize_f32, visit_f32);
709 
710     forward_to_deserialize_any! {
711         unit_struct seq tuple tuple_struct map struct enum identifier ignored_any
712     }
713 }
714