Function csv::invalid_option [] [src]

pub fn invalid_option<'de, D, T>(de: D) -> Result<Option<T>, D::Error> where
    D: Deserializer<'de>,
    Option<T>: Deserialize<'de>, 

A custom Serde deserializer for possibly invalid Option<T> fields.

When deserializing CSV data, it is sometimes desirable to simply ignore fields with invalid data. For example, there might be a field that is usually a number, but will occasionally contain garbage data that causes number parsing to fail.

You might be inclined to use, say, Option<i32> for fields such at this. By default, however, Option<i32> will either capture empty fields with None or valid numeric fields with Some(the_number). If the field is non-empty and not a valid number, then deserialization will return an error instead of using None.

This function allows you to override this default behavior. Namely, if Option<T> is deserialized with non-empty but invalid data, then the value will be None and the error will be ignored.

# Example

This example shows how to parse CSV records with numerical data, even if some numerical data is absent or invalid. Without the serde(deserialize_with = "...") annotations, this example would return an error.

extern crate csv;
 #[macro_use]
 extern crate serde_derive;

 use std::error::Error;
 use csv::Reader;

 #[derive(Debug, Deserialize, Eq, PartialEq)]
 struct Row {
     #[serde(deserialize_with = "csv::invalid_option")]
     a: Option<i32>,
     #[serde(deserialize_with = "csv::invalid_option")]
     b: Option<i32>,
     #[serde(deserialize_with = "csv::invalid_option")]
     c: Option<i32>,
 }

 fn example() -> Result<(), Box<Error>> {
     let data = "\
a,b,c
5,\"\",xyz
";
     let mut rdr = Reader::from_reader(data.as_bytes());
     if let Some(result) = rdr.deserialize().next() {
         let record: Row = result?;
         assert_eq!(record, Row { a: Some(5), b: None, c: None });
         Ok(())
     } else {
         Err(From::from("expected at least one record but got none"))
     }
 }