handle missing deck ID in templates

https://github.com/ankidroid/Anki-Android/issues/7512
This commit is contained in:
Damien Elmes 2021-01-25 15:54:44 +10:00
parent ef9f6b022b
commit d70132cc8b
2 changed files with 31 additions and 1 deletions

View file

@ -264,7 +264,7 @@ pub struct CardTemplateSchema11 {
pub(crate) bqfmt: String, pub(crate) bqfmt: String,
#[serde(default)] #[serde(default)]
pub(crate) bafmt: String, pub(crate) bafmt: String,
#[serde(deserialize_with = "default_on_invalid")] #[serde(deserialize_with = "default_on_invalid", default)]
pub(crate) did: Option<DeckID>, pub(crate) did: Option<DeckID>,
#[serde(default, deserialize_with = "default_on_invalid")] #[serde(default, deserialize_with = "default_on_invalid")]
pub(crate) bfont: String, pub(crate) bfont: String,

View file

@ -8,6 +8,8 @@ pub(crate) use serde_aux::field_attributes::{
}; };
use serde_json::Value; use serde_json::Value;
/// Note: if you wish to cover the case where a field is missing, make sure you also
/// use the `serde(default)` flag.
pub(crate) fn default_on_invalid<'de, T, D>(deserializer: D) -> Result<T, D::Error> pub(crate) fn default_on_invalid<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where where
T: Default + DeTrait<'de>, T: Default + DeTrait<'de>,
@ -63,3 +65,31 @@ impl FromI64 for TimestampSecs {
TimestampSecs(val as i64) TimestampSecs(val as i64)
} }
} }
#[cfg(test)]
mod test {
use super::*;
use serde::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct MaybeInvalid {
#[serde(deserialize_with = "default_on_invalid", default)]
field: Option<usize>,
}
#[test]
fn invalid_or_missing() {
assert_eq!(
serde_json::from_str::<MaybeInvalid>(r#"{"field": 5}"#).unwrap(),
MaybeInvalid { field: Some(5) }
);
assert_eq!(
serde_json::from_str::<MaybeInvalid>(r#"{"field": "5"}"#).unwrap(),
MaybeInvalid { field: None }
);
assert_eq!(
serde_json::from_str::<MaybeInvalid>(r#"{"another": 5}"#).unwrap(),
MaybeInvalid { field: None }
);
}
}