rsql_rs/ast/
constraint.rs

1use 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}