treat out of bounds dates as unknown value

This commit is contained in:
Smitty 2021-05-30 10:10:10 -04:00
parent 38b35a77cb
commit 284af1ad9f
2 changed files with 20 additions and 10 deletions

View file

@ -398,7 +398,12 @@ impl Entity {
.as_str() .as_str()
.ok_or(EntityError::NoRank)?, .ok_or(EntityError::NoRank)?,
)?, )?,
data: ClaimValueData::parse_snak(claim.get_mut("mainsnak").ok_or(EntityError::MissingMainsnak)?.take())?, data: ClaimValueData::parse_snak(
claim
.get_mut("mainsnak")
.ok_or(EntityError::MissingMainsnak)?
.take(),
)?,
qualifiers, qualifiers,
references, references,
}, },
@ -704,13 +709,18 @@ impl ClaimValueData {
lower_bound: parse_wb_number(&take_prop("lowerBound", &mut value)).ok(), lower_bound: parse_wb_number(&take_prop("lowerBound", &mut value)).ok(),
unit: try_get_as_qid(&take_prop("unit", &mut value)).ok(), unit: try_get_as_qid(&take_prop("unit", &mut value)).ok(),
}), }),
"time" => Ok(ClaimValueData::DateTime { // our time parsing code can't handle a few edge cases (really old years), so we
// our time parsing code can't handle a few edge cases (really old years), so we "time" => Ok(
// just give up on parsing the snak if parse_wb_time returns None match parse_wb_time(&get_json_string(take_prop("time", &mut value))?) {
date_time: parse_wb_time(&get_json_string(take_prop("time", &mut value))?)?, Ok(date_time) => ClaimValueData::DateTime {
precision: parse_wb_number(&take_prop("precision", &mut value)) date_time,
.map_err(|_| EntityError::InvalidPrecision)? as u8, precision: parse_wb_number(&take_prop("precision", &mut value))
}), .map_err(|_| EntityError::InvalidPrecision)?
as u8,
},
Err(_) => ClaimValueData::UnknownValue,
},
),
"monolingualtext" => Ok(ClaimValueData::MonolingualText(Text { "monolingualtext" => Ok(ClaimValueData::MonolingualText(Text {
text: get_json_string(take_prop("text", &mut value))?, text: get_json_string(take_prop("text", &mut value))?,
lang: Lang(get_json_string(take_prop("language", &mut value))?), lang: Lang(get_json_string(take_prop("language", &mut value))?),

View file

@ -2,7 +2,8 @@ use wikidata::*;
#[test] #[test]
fn simple_item() { fn simple_item() {
let j: serde_json::Value = serde_json::from_str(include_str!("../items/Q106975887.json")).unwrap(); let j: serde_json::Value =
serde_json::from_str(include_str!("../items/Q106975887.json")).unwrap();
Entity::from_json(j).unwrap(); Entity::from_json(j).unwrap();
} }
@ -13,7 +14,6 @@ fn douglas_adams() {
} }
#[test] #[test]
#[ignore = "can't handle year right"]
fn universe() { fn universe() {
let j: serde_json::Value = serde_json::from_str(include_str!("../items/Q1.json")).unwrap(); let j: serde_json::Value = serde_json::from_str(include_str!("../items/Q1.json")).unwrap();
Entity::from_json(j).unwrap(); Entity::from_json(j).unwrap();