use serde::{Deserialize, Deserializer};
use serde_json::Value;
pub(crate) fn deserialize_level_order<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
where
D: Deserializer<'de>,
{
let values = Option::<Vec<Value>>::deserialize(deserializer)?.unwrap_or_default();
values
.into_iter()
.map(|v| match v {
Value::Number(n) => Ok(n.to_string()),
Value::String(s) => Ok(s),
other => Err(serde::de::Error::custom(format!(
"expected string or number for level_order entry, got {other}"
))),
})
.collect()
}
pub(crate) fn default_level() -> String {
"0".to_string()
}
pub(crate) fn deserialize_level<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let opt = Option::<Value>::deserialize(deserializer)?;
let Some(value) = opt else {
return Ok(default_level());
};
match value {
Value::String(s) => Ok(s),
Value::Number(n) => Ok(n.to_string()),
other => Err(serde::de::Error::custom(format!(
"expected string or number, got {other}"
))),
}
}