wip: parsing of values

This commit is contained in:
Greg Heartsfield 2022-10-15 15:46:07 -05:00
parent 9833c91470
commit 487fe5260a

View File

@ -80,11 +80,11 @@ impl FromStr for Operator {
} }
} }
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)] //#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)]
/// Values are the data associated with a restriction. For now, these can only be a single numbers. /// Values are the data associated with a restriction. For now, these can only be a single numbers.
pub enum Value { //pub enum Value {
Number(u64), // Number(u64),
} //}
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)] #[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)]
pub struct ConditionQuery { pub struct ConditionQuery {
@ -106,7 +106,7 @@ pub struct Delegation {
pub struct Condition { pub struct Condition {
pub(crate) field: Field, pub(crate) field: Field,
pub(crate) operator: Operator, pub(crate) operator: Operator,
pub(crate) values: Vec<Value>, pub(crate) values: Vec<usize>,
} }
fn str_to_condition(cs: &str) -> Option<Condition> { fn str_to_condition(cs: &str) -> Option<Condition> {
@ -118,12 +118,17 @@ fn str_to_condition(cs: &str) -> Option<Condition> {
let caps = RE.captures(cs)?; let caps = RE.captures(cs)?;
let field = caps.get(1)?.as_str().parse::<Field>().ok()?; let field = caps.get(1)?.as_str().parse::<Field>().ok()?;
let operator = caps.get(2)?.as_str().parse::<Operator>().ok()?; let operator = caps.get(2)?.as_str().parse::<Operator>().ok()?;
let _vals = caps.get(3)?.as_str(); // values are just comma separated numbers, but all must be parsed
let rawvals = caps.get(3)?.as_str();
let values = rawvals
.split_terminator(',')
.map(|n| n.parse::<usize>().ok())
.collect::<Option<Vec<_>>>()?;
// convert field string into Field // convert field string into Field
Some(Condition { Some(Condition {
field, field,
operator, operator,
values: vec![], values,
}) })
} }
@ -192,4 +197,34 @@ mod tests {
assert_eq!(parsed, kind_cq); assert_eq!(parsed, kind_cq);
Ok(()) Ok(())
} }
// parse a full conditional query with a single value
#[test]
fn parse_kind_equals_singleval() -> Result<()> {
// given an empty condition query, produce an empty vector
let kind_cq = ConditionQuery {
conditions: vec![Condition {
field: Field::Kind,
operator: Operator::Equals,
values: vec![1],
}],
};
let parsed = "kind=1".parse::<ConditionQuery>()?;
assert_eq!(parsed, kind_cq);
Ok(())
}
// parse a full conditional query with multiple values
#[test]
fn parse_kind_equals_multival() -> Result<()> {
// given an empty condition query, produce an empty vector
let kind_cq = ConditionQuery {
conditions: vec![Condition {
field: Field::Kind,
operator: Operator::Equals,
values: vec![1, 2, 4],
}],
};
let parsed = "kind=1,2,4".parse::<ConditionQuery>()?;
assert_eq!(parsed, kind_cq);
Ok(())
}
} }