calamine icon indicating copy to clipboard operation
calamine copied to clipboard

deserialize_with empty values

Open shiftrtech opened this issue 3 years ago • 0 comments

Hi, when i use this:

use serde::{Deserialize, Serialize};
use calamine::{RangeDeserializerBuilder, Reader, Xlsx};


#[derive(Serialize, Deserialize, Debug)]
struct RawExcelRow {
    metric: String,
    #[serde(deserialize_with = "de_opt_f64")]
    value: Option<f64>,
}


// Convert value cell to Some(f64) if float or int, else None
fn de_opt_f64<'de, D>(deserializer: D) -> Result<Option<f64>, D::Error>
where
    D: serde::Deserializer<'de>,
{
    let data_type = calamine::DataType::deserialize(deserializer);
    match data_type {
        Ok(calamine::DataType::Error(_)) => Ok(None),
        Ok(calamine::DataType::Float(f)) => Ok(Some(f)),
        Ok(calamine::DataType::Int(i)) => Ok(Some(i as f64)),
        _ => Ok(None),
    }
}

If row on columnvalue is empty, the row is fully skipped, is this a bug? is there a way to catch the "error" or provide a default value?, if i try on match statement it doesn't works:

// Convert value cell to Some(f64) if float or int, else None
fn de_opt_f64<'de, D>(deserializer: D) -> Result<Option<f64>, D::Error>
where
   D: serde::Deserializer<'de>,
{
   let data_type = calamine::DataType::deserialize(deserializer);
   dbg!("Error"); // I can't reach this
   match data_type {
       Ok(calamine::DataType::Error(_)) => Ok(None),
       Ok(calamine::DataType::Float(f)) => Ok(Some(f)),
       Ok(calamine::DataType::Int(i)) => Ok(Some(i as f64)),
       Err(err) => { 
            dbg!("Error"); // I can't reach this either
            Err(err)
       },
       _ => Ok(None),
   }
}

shiftrtech avatar Apr 07 '21 22:04 shiftrtech