MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / parse_atom

Function parse_atom

nodedb/src/control/security/predicate_parser.rs:173–271  ·  view source on GitHub ↗
(tokens: &[String], pos: &mut usize)

Source from the content-addressed store, hash-verified

171}
172
173fn parse_atom(tokens: &[String], pos: &mut usize) -> Result<RlsPredicate, PredicateParseError> {
174 if *pos >= tokens.len() {
175 return Err(PredicateParseError::UnexpectedEnd);
176 }
177
178 // NOT prefix
179 if tokens[*pos].to_uppercase() == "NOT" {
180 *pos += 1;
181 let inner = parse_atom(tokens, pos)?;
182 return Ok(RlsPredicate::Not(Box::new(inner)));
183 }
184
185 // Parenthesized expression
186 if tokens[*pos] == "(" {
187 *pos += 1;
188 let inner = parse_or_expr(tokens, pos)?;
189 if *pos >= tokens.len() || tokens[*pos] != ")" {
190 return Err(PredicateParseError::UnmatchedParen);
191 }
192 *pos += 1;
193 return Ok(inner);
194 }
195
196 // Look ahead for CONTAINS / INTERSECTS / comparison operator
197 let left_value = parse_value_ref(tokens, pos)?;
198
199 if *pos >= tokens.len() {
200 // Standalone value — treat as boolean (truthy).
201 return match left_value {
202 PredicateValue::AuthRef(_)
203 | PredicateValue::Field(_)
204 | PredicateValue::AuthFunc { .. } => Ok(RlsPredicate::Compare {
205 field: match &left_value {
206 PredicateValue::Field(f) => f.clone(),
207 _ => String::new(),
208 },
209 op: CompareOp::IsNotNull,
210 value: left_value,
211 }),
212 PredicateValue::Literal(_) => Ok(RlsPredicate::AlwaysTrue),
213 };
214 }
215
216 let op_token = tokens[*pos].to_uppercase();
217
218 match op_token.as_str() {
219 "CONTAINS" => {
220 *pos += 1;
221 let element = parse_value_ref(tokens, pos)?;
222 Ok(RlsPredicate::Contains {
223 set: left_value,
224 element,
225 })
226 }
227 "INTERSECTS" => {
228 *pos += 1;
229 let right = parse_value_ref(tokens, pos)?;
230 Ok(RlsPredicate::Intersects {

Callers 1

parse_and_exprFunction · 0.70

Calls 6

parse_or_exprFunction · 0.85
parse_compare_opFunction · 0.85
parse_value_refFunction · 0.70
lenMethod · 0.45
cloneMethod · 0.45
as_strMethod · 0.45

Tested by

no test coverage detected