in crates/iceberg/src/spec/datatypes.rs [227:272]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(field_identifier, rename_all = "lowercase")]
enum Field {
Type,
Fields,
}
struct StructTypeVisitor;
impl<'de> Visitor<'de> for StructTypeVisitor {
type Value = StructType;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("struct")
}
fn visit_map<V>(self, mut map: V) -> Result<StructType, V::Error>
where
V: MapAccess<'de>,
{
let mut fields = None;
while let Some(key) = map.next_key()? {
match key {
Field::Type => (),
Field::Fields => {
if fields.is_some() {
return Err(serde::de::Error::duplicate_field("fields"));
}
fields = Some(map.next_value()?);
}
}
}
let fields: Vec<NestedField> =
fields.ok_or_else(|| de::Error::missing_field("fields"))?;
Ok(StructType::new(fields))
}
}
const FIELDS: &[&str] = &["type", "fields"];
deserializer.deserialize_struct("struct", FIELDS, StructTypeVisitor)
}