From 284af1ad9f32463e33908b5d92eed28e90364df1 Mon Sep 17 00:00:00 2001 From: Smitty Date: Sun, 30 May 2021 10:10:10 -0400 Subject: [PATCH] treat out of bounds dates as unknown value --- src/entity.rs | 26 ++++++++++++++++++-------- tests/entity-from-json.rs | 4 ++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/entity.rs b/src/entity.rs index 48c1a07..2492092 100755 --- a/src/entity.rs +++ b/src/entity.rs @@ -398,7 +398,12 @@ impl Entity { .as_str() .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, references, }, @@ -704,13 +709,18 @@ impl ClaimValueData { lower_bound: parse_wb_number(&take_prop("lowerBound", &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 - // just give up on parsing the snak if parse_wb_time returns None - date_time: parse_wb_time(&get_json_string(take_prop("time", &mut value))?)?, - precision: parse_wb_number(&take_prop("precision", &mut value)) - .map_err(|_| EntityError::InvalidPrecision)? as u8, - }), + // our time parsing code can't handle a few edge cases (really old years), so we + "time" => Ok( + match parse_wb_time(&get_json_string(take_prop("time", &mut value))?) { + Ok(date_time) => ClaimValueData::DateTime { + date_time, + precision: parse_wb_number(&take_prop("precision", &mut value)) + .map_err(|_| EntityError::InvalidPrecision)? + as u8, + }, + Err(_) => ClaimValueData::UnknownValue, + }, + ), "monolingualtext" => Ok(ClaimValueData::MonolingualText(Text { text: get_json_string(take_prop("text", &mut value))?, lang: Lang(get_json_string(take_prop("language", &mut value))?), diff --git a/tests/entity-from-json.rs b/tests/entity-from-json.rs index f2907ea..1f5293e 100644 --- a/tests/entity-from-json.rs +++ b/tests/entity-from-json.rs @@ -2,7 +2,8 @@ use wikidata::*; #[test] 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(); } @@ -13,7 +14,6 @@ fn douglas_adams() { } #[test] -#[ignore = "can't handle year right"] fn universe() { let j: serde_json::Value = serde_json::from_str(include_str!("../items/Q1.json")).unwrap(); Entity::from_json(j).unwrap();