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