From 48eb6bf085606aed39696d468a2a3d4dabf205ac Mon Sep 17 00:00:00 2001 From: Smitty Date: Sat, 29 May 2021 17:06:52 -0400 Subject: [PATCH] validate snak parsing results --- src/entity.rs | 39 ++++++++++++++++++--------------------- tests/claim-from-json.rs | 11 ++++++++--- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/entity.rs b/src/entity.rs index d31b6b7..b869252 100755 --- a/src/entity.rs +++ b/src/entity.rs @@ -30,7 +30,7 @@ pub enum EntityType { } /// Data relating to a claim value. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum ClaimValueData { /// The ID of a file on Wikimedia Commons. CommonsMedia(String), @@ -252,19 +252,19 @@ pub enum EntityError { } fn get_json_string(json: Value) -> Result { - json.as_str().map(ToString::to_string).ok_or(EntityError::ExpectedString) + json.as_str() + .map(ToString::to_string) + .ok_or(EntityError::ExpectedString) } fn parse_wb_number(num: &Value) -> Result { match num { Value::Number(num) => num.as_f64().ok_or(EntityError::NumberOutOfBounds), - Value::String(s) => { - match s.parse() { - Ok(x) => Ok(x), - Err(_) => Err(EntityError::FloatParse), - } - } - _ => Err(EntityError::ExpectedNumberString) + Value::String(s) => match s.parse() { + Ok(x) => Ok(x), + Err(_) => Err(EntityError::FloatParse), + }, + _ => Err(EntityError::ExpectedNumberString), } } @@ -489,7 +489,6 @@ impl ClaimValue { v.push(ReferenceGroup { claims }); } v - } else { Vec::new() }; @@ -498,12 +497,11 @@ impl ClaimValue { let mut v: Vec<(Pid, ClaimValueData)> = vec![]; for (pid, claim_array_json) in qualifiers_json.as_object()?.iter() { // yep it's a clone, meh - let mut claim_array = - if let Value::Array(x) = claim_array_json.clone().take() { - x - } else { - return None; - }; + let mut claim_array = if let Value::Array(x) = claim_array_json.clone().take() { + x + } else { + return None; + }; for claim in claim_array.drain(..) { if let Ok(x) = ClaimValueData::parse_snak(claim) { v.push((Pid(pid[1..].parse().ok()?), x)) @@ -519,9 +517,7 @@ impl ClaimValue { id: if skip_id { String::new() } else { - take_prop("id", &mut claim) - .as_str()? - .to_string() + take_prop("id", &mut claim).as_str()?.to_string() }, data, references, @@ -565,8 +561,9 @@ mod test { #[test] fn as_qid_test() { - let qid = - try_get_as_qid(&serde_json::from_str(r#""http://www.wikidata.org/entity/Q1234567""#).unwrap()); + let qid = try_get_as_qid( + &serde_json::from_str(r#""http://www.wikidata.org/entity/Q1234567""#).unwrap(), + ); assert_eq!(qid, Ok(Qid(1234567))); } } diff --git a/tests/claim-from-json.rs b/tests/claim-from-json.rs index b3b46d3..a67ba50 100644 --- a/tests/claim-from-json.rs +++ b/tests/claim-from-json.rs @@ -1,11 +1,14 @@ // test parsing various snaks +use wikidata::*; + #[test] fn simple_snak_from_json() { let j: serde_json:: Value = serde_json::from_str(include_str!("../items/Q106975887.json")).unwrap(); let snak = &j["entities"]["Q106975887"]["claims"]["P31"][0]["mainsnak"]; println!("{:?}", snak); - wikidata::ClaimValueData::parse_snak(snak.clone()).unwrap(); + let data = ClaimValueData::parse_snak(snak.clone()).unwrap(); + assert_eq!(data, ClaimValueData::Item(Qid(5))); } @@ -14,7 +17,8 @@ fn complex_snak_from_json() { let j: serde_json:: Value = serde_json::from_str(include_str!("../items/Q42.json")).unwrap(); let snak = &j["entities"]["Q42"]["claims"]["P18"][0]["mainsnak"]; println!("{:?}", snak); - wikidata::ClaimValueData::parse_snak(snak.clone()).unwrap(); + let data = ClaimValueData::parse_snak(snak.clone()).unwrap(); + assert_eq!(data, ClaimValueData::CommonsMedia("Douglas adams portrait cropped.jpg".to_string())); } #[test] @@ -22,5 +26,6 @@ fn other_complex_snak_from_json() { let j: serde_json:: Value = serde_json::from_str(include_str!("../items/Q1.json")).unwrap(); let snak = &j["entities"]["Q1"]["claims"]["P793"][0]["mainsnak"]; println!("{:?}", snak); - wikidata::ClaimValueData::parse_snak(snak.clone()).unwrap(); + let data = ClaimValueData::parse_snak(snak.clone()).unwrap(); + assert_eq!(data, ClaimValueData::Item(Qid(323))); }