validate snak parsing results

This commit is contained in:
Smitty 2021-05-29 17:06:52 -04:00
parent 2939ad9918
commit 48eb6bf085
2 changed files with 26 additions and 24 deletions

View file

@ -30,7 +30,7 @@ pub enum EntityType {
} }
/// Data relating to a claim value. /// Data relating to a claim value.
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ClaimValueData { pub enum ClaimValueData {
/// The ID of a file on Wikimedia Commons. /// The ID of a file on Wikimedia Commons.
CommonsMedia(String), CommonsMedia(String),
@ -252,19 +252,19 @@ pub enum EntityError {
} }
fn get_json_string(json: Value) -> Result<String, EntityError> { fn get_json_string(json: Value) -> Result<String, EntityError> {
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<f64, EntityError> { fn parse_wb_number(num: &Value) -> Result<f64, EntityError> {
match num { match num {
Value::Number(num) => num.as_f64().ok_or(EntityError::NumberOutOfBounds), Value::Number(num) => num.as_f64().ok_or(EntityError::NumberOutOfBounds),
Value::String(s) => { Value::String(s) => match s.parse() {
match s.parse() { Ok(x) => Ok(x),
Ok(x) => Ok(x), Err(_) => Err(EntityError::FloatParse),
Err(_) => Err(EntityError::FloatParse), },
} _ => Err(EntityError::ExpectedNumberString),
}
_ => Err(EntityError::ExpectedNumberString)
} }
} }
@ -489,7 +489,6 @@ impl ClaimValue {
v.push(ReferenceGroup { claims }); v.push(ReferenceGroup { claims });
} }
v v
} else { } else {
Vec::new() Vec::new()
}; };
@ -498,12 +497,11 @@ impl ClaimValue {
let mut v: Vec<(Pid, ClaimValueData)> = vec![]; let mut v: Vec<(Pid, ClaimValueData)> = vec![];
for (pid, claim_array_json) in qualifiers_json.as_object()?.iter() { for (pid, claim_array_json) in qualifiers_json.as_object()?.iter() {
// yep it's a clone, meh // yep it's a clone, meh
let mut claim_array = let mut claim_array = if let Value::Array(x) = claim_array_json.clone().take() {
if let Value::Array(x) = claim_array_json.clone().take() { x
x } else {
} else { return None;
return None; };
};
for claim in claim_array.drain(..) { for claim in claim_array.drain(..) {
if let Ok(x) = ClaimValueData::parse_snak(claim) { if let Ok(x) = ClaimValueData::parse_snak(claim) {
v.push((Pid(pid[1..].parse().ok()?), x)) v.push((Pid(pid[1..].parse().ok()?), x))
@ -519,9 +517,7 @@ impl ClaimValue {
id: if skip_id { id: if skip_id {
String::new() String::new()
} else { } else {
take_prop("id", &mut claim) take_prop("id", &mut claim).as_str()?.to_string()
.as_str()?
.to_string()
}, },
data, data,
references, references,
@ -565,8 +561,9 @@ mod test {
#[test] #[test]
fn as_qid_test() { fn as_qid_test() {
let qid = let qid = try_get_as_qid(
try_get_as_qid(&serde_json::from_str(r#""http://www.wikidata.org/entity/Q1234567""#).unwrap()); &serde_json::from_str(r#""http://www.wikidata.org/entity/Q1234567""#).unwrap(),
);
assert_eq!(qid, Ok(Qid(1234567))); assert_eq!(qid, Ok(Qid(1234567)));
} }
} }

View file

@ -1,11 +1,14 @@
// test parsing various snaks // test parsing various snaks
use wikidata::*;
#[test] #[test]
fn simple_snak_from_json() { fn simple_snak_from_json() {
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();
let snak = &j["entities"]["Q106975887"]["claims"]["P31"][0]["mainsnak"]; let snak = &j["entities"]["Q106975887"]["claims"]["P31"][0]["mainsnak"];
println!("{:?}", snak); 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 j: serde_json:: Value = serde_json::from_str(include_str!("../items/Q42.json")).unwrap();
let snak = &j["entities"]["Q42"]["claims"]["P18"][0]["mainsnak"]; let snak = &j["entities"]["Q42"]["claims"]["P18"][0]["mainsnak"];
println!("{:?}", snak); 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] #[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 j: serde_json:: Value = serde_json::from_str(include_str!("../items/Q1.json")).unwrap();
let snak = &j["entities"]["Q1"]["claims"]["P793"][0]["mainsnak"]; let snak = &j["entities"]["Q1"]["claims"]["P793"][0]["mainsnak"];
println!("{:?}", snak); println!("{:?}", snak);
wikidata::ClaimValueData::parse_snak(snak.clone()).unwrap(); let data = ClaimValueData::parse_snak(snak.clone()).unwrap();
assert_eq!(data, ClaimValueData::Item(Qid(323)));
} }