rsql_rs/ast/
constraint.rs1use crate::ast::comparison::Comparison;
2use crate::error::ParserError;
3use crate::ParserResult;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
7pub struct Arguments(pub Vec<String>);
8
9#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
10pub struct Constraint {
11 pub selector: String,
12 pub comparison: Comparison,
13 pub arguments: Arguments,
14}
15
16impl Constraint {
17 pub fn new(selector: &str, comparision: &Comparison, arguments: &[&str]) -> ParserResult<Self> {
18 if comparision.multi_values {
19 let expect_args = "> 1".to_string();
20 if arguments.len() <= 1 {
21 return Err(ParserError::InvalidConstraintArgs(expect_args, arguments.len()));
22 }
23 } else {
24 let expect_args = "== 1".to_string();
25 if arguments.len() != 1 {
26 return Err(ParserError::InvalidConstraintArgs(expect_args, arguments.len()));
27 }
28 }
29
30 Ok(Constraint {
31 selector: selector.to_string(),
32 comparison: comparision.clone(),
33 arguments: Arguments(arguments.iter().map(ToString::to_string).collect()),
34 })
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use crate::ast::comparison;
41 use crate::ast::comparison::Comparison;
42 use crate::ast::constraint::Constraint;
43 use crate::ParserResult;
44
45 #[test]
46 fn test_new() -> ParserResult<()> {
47 let comp_eq: &Comparison = &comparison::EQUAL as &Comparison;
48 let constraint = Constraint::new("name", comp_eq, &["new_name"])?;
49 println!("{:?}", constraint);
50 Ok(())
51 }
52}