calamine
calamine copied to clipboard
deserialize_with empty values
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),
}
}