validate snak parsing results
This commit is contained in:
parent
2939ad9918
commit
48eb6bf085
2 changed files with 26 additions and 24 deletions
|
@ -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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue