use serde::{ de::{self, Visitor}, Deserialize, Deserializer, Serialize, }; #[derive(Serialize, Deserialize, Debug, Default, Clone)] pub struct FileReference { #[serde(alias = "fileID")] pub file_id: i64, #[serde(default, deserialize_with = "deserialize_option_string_or_float")] pub guid: Option, } fn deserialize_option_string_or_float<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { struct StringOrFloat; impl<'de> Visitor<'de> for StringOrFloat { type Value = Option; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a string or a float") } fn visit_str(self, value: &str) -> Result { Ok(Some(value.to_owned())) } fn visit_string(self, value: String) -> Result { Ok(Some(value)) } fn visit_f64(self, _: f64) -> Result { Ok(None) } fn visit_f32(self, _: f32) -> Result { Ok(None) } fn visit_none(self) -> Result { Ok(None) } fn visit_unit(self) -> Result { Ok(None) } } deserializer.deserialize_any(StringOrFloat) }