1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use super::*;
use crate::element::*;
use crate::error::{Error, Result};
use serde::{Deserialize, Serialize};
#[inline]
fn is_false(v: &bool) -> bool {
!v
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields, default)]
pub struct BoolValidator {
#[serde(skip_serializing_if = "String::is_empty")]
pub comment: String,
#[serde(rename = "in", skip_serializing_if = "Vec::is_empty")]
pub in_list: Vec<bool>,
#[serde(rename = "nin", skip_serializing_if = "Vec::is_empty")]
pub nin_list: Vec<bool>,
#[serde(skip_serializing_if = "is_false")]
pub query: bool,
}
impl std::default::Default for BoolValidator {
fn default() -> Self {
Self {
comment: String::new(),
in_list: Vec::new(),
nin_list: Vec::new(),
query: false,
}
}
}
impl BoolValidator {
pub fn new() -> Self {
Self::default()
}
pub fn comment(mut self, comment: impl Into<String>) -> Self {
self.comment = comment.into();
self
}
pub fn in_add(mut self, add: bool) -> Self {
self.in_list.push(add);
self
}
pub fn nin_add(mut self, add: bool) -> Self {
self.nin_list.push(add);
self
}
pub fn query(mut self, query: bool) -> Self {
self.query = query;
self
}
pub fn build(self) -> Validator {
Validator::Bool(self)
}
pub(crate) fn validate(&self, parser: &mut Parser) -> Result<()> {
let elem = parser
.next()
.ok_or_else(|| Error::FailValidate("Expected a boolean".to_string()))??;
let elem = if let Element::Bool(v) = elem {
v
} else {
return Err(Error::FailValidate(format!(
"Expected Bool, got {}",
elem.name()
)));
};
if !self.in_list.is_empty() && !self.in_list.iter().any(|v| *v == elem) {
return Err(Error::FailValidate(
"Boolean is not on `in` list".to_string(),
));
}
if self.nin_list.iter().any(|v| *v == elem) {
return Err(Error::FailValidate("Boolean is on `nin` list".to_string()));
}
Ok(())
}
fn query_check_bool(&self, other: &Self) -> bool {
self.query || (other.in_list.is_empty() && other.nin_list.is_empty())
}
pub(crate) fn query_check(&self, other: &Validator) -> bool {
match other {
Validator::Bool(other) => self.query_check_bool(other),
Validator::Multi(list) => list.iter().all(|other| match other {
Validator::Bool(other) => self.query_check_bool(other),
_ => false,
}),
Validator::Any => true,
_ => false,
}
}
}