use std::fmt;
use qubit_datatype::DataType;
use serde::Deserializer;
use serde::de::MapAccess;
use serde::de::Visitor;
const FIELD_NAMES: &[&str] = &["data_type", "required"];
pub(crate) fn deserialize_metadata_field<'de, D>(deserializer: D) -> Result<(DataType, bool), D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_struct("MetadataField", FIELD_NAMES, MetadataFieldVisitor)
}
struct MetadataFieldVisitor;
impl<'de> Visitor<'de> for MetadataFieldVisitor {
type Value = (DataType, bool);
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("a metadata field object")
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let mut data_type = None;
let mut required = None;
while let Some(key) = map.next_key::<String>()? {
match key.as_str() {
"data_type" => {
if data_type.is_some() {
return Err(serde::de::Error::duplicate_field("data_type"));
}
data_type = Some(map.next_value::<DataType>()?);
}
"required" => {
if required.is_some() {
return Err(serde::de::Error::duplicate_field("required"));
}
required = Some(map.next_value::<bool>()?);
}
_ => {
return Err(serde::de::Error::unknown_field(&key, FIELD_NAMES));
}
}
}
let data_type = data_type.ok_or_else(|| serde::de::Error::missing_field("data_type"))?;
let required = required.ok_or_else(|| serde::de::Error::missing_field("required"))?;
Ok((data_type, required))
}
}