Improve ignored field handling, remove testing schema

main
Elnu 10 months ago
parent 30ee7577eb
commit 2f54f16864

@ -22,7 +22,9 @@ pub struct JmdictEntry {
#[derive(Deserialize)]
#[serde(rename_all(deserialize = "PascalCase"), deny_unknown_fields)]
pub struct JmdictExample {
pub srce: JmdictExampleSource,
// Always empty with latest version of JMdict
#[serde(default, skip_serializing, deserialize_with = "err_if_not_blank")]
srcaswdfa: serde::de::IgnoredAny,
pub sentences: Vec<JmdictExampleSentence>,
}
@ -34,13 +36,6 @@ pub struct JmdictExampleSentence {
pub text: String,
}
#[derive(Deserialize)]
#[serde(rename_all(deserialize = "PascalCase"), deny_unknown_fields)]
pub struct JmdictExampleSource {
pub id: String,
pub src_type: JmdictExampleSourceSrcType,
}
#[derive(Deserialize)]
#[serde(rename_all(deserialize = "PascalCase"), deny_unknown_fields)]
pub enum JmdictExampleSourceSrcType {
@ -54,7 +49,7 @@ pub struct JmdictGlossary {
#[serde(deserialize_with = "lang_default_eng")]
pub language: LanguageCode,
// Always empty with latest version of JMdict
#[serde(default, skip_serializing, deserialize_with = "err_if_not_null")]
#[serde(default, skip_serializing, deserialize_with = "err_if_not_blank")]
gender: serde::de::IgnoredAny,
pub r#type: Option<JmdictGlossaryType>,
}
@ -87,7 +82,7 @@ pub struct JmdictKanji {
pub struct JmdictReading {
pub reading: String,
// Always empty with latest version of JMdict
#[serde(default, skip_serializing, deserialize_with = "err_if_not_null")]
#[serde(default, skip_serializing, deserialize_with = "err_if_not_blank")]
no_kanji: serde::de::IgnoredAny,
#[serde(deserialize_with = "nullable_list")]
pub restrictions: Vec<String>,

@ -84,13 +84,14 @@ where
.map_err(|err| serde::de::Error::custom(err))
}
pub fn err_if_not_null<'de, D>(deserializer: D) -> Result<serde::de::IgnoredAny, D::Error>
pub fn err_if_not_blank<'de, D>(deserializer: D) -> Result<serde::de::IgnoredAny, D::Error>
where
D: Deserializer<'de>,
{
match serde_json::Value::deserialize(deserializer)? {
Value::Null => Ok(serde::de::IgnoredAny),
Value::String(str) if str.is_empty() => Ok(serde::de::IgnoredAny),
_ => Err(serde::de::Error::custom("Expected null or empty string!")),
let value = serde_json::Value::deserialize(deserializer)?;
if value.is_null() || value == "" {
Ok(serde::de::IgnoredAny)
} else {
Err(serde::de::Error::custom("Expected null or empty string!"))
}
}

Loading…
Cancel
Save