mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Fix key, value in membership and some-in
Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
Anand Krishnamoorthi
parent
3549931342
commit
eded43bdc6
@@ -136,8 +136,8 @@ pub enum Expr<'source> {
|
||||
|
||||
Membership {
|
||||
span: Span<'source>,
|
||||
key: Box<Expr<'source>>,
|
||||
value: Box<Option<Expr<'source>>>,
|
||||
key: Box<Option<Expr<'source>>>,
|
||||
value: Box<Expr<'source>>,
|
||||
collection: Box<Expr<'source>>,
|
||||
},
|
||||
}
|
||||
@@ -174,8 +174,8 @@ pub enum Literal<'source> {
|
||||
},
|
||||
SomeIn {
|
||||
span: Span<'source>,
|
||||
key: Expr<'source>,
|
||||
value: Option<Expr<'source>>,
|
||||
key: Option<Expr<'source>>,
|
||||
value: Expr<'source>,
|
||||
collection: Expr<'source>,
|
||||
},
|
||||
Expr {
|
||||
|
||||
@@ -233,10 +233,10 @@ impl<'source> Interpreter<'source> {
|
||||
collection,
|
||||
..
|
||||
} => {
|
||||
self.hoist_loops_impl(key, loops);
|
||||
if let Some(value) = value.as_ref() {
|
||||
self.hoist_loops_impl(value, loops);
|
||||
if let Some(key) = key.as_ref() {
|
||||
self.hoist_loops_impl(key, loops);
|
||||
}
|
||||
self.hoist_loops_impl(value, loops);
|
||||
self.hoist_loops_impl(collection, loops);
|
||||
}
|
||||
|
||||
@@ -258,10 +258,10 @@ impl<'source> Interpreter<'source> {
|
||||
collection,
|
||||
..
|
||||
} => {
|
||||
self.hoist_loops_impl(key, &mut loops);
|
||||
if let Some(value) = value {
|
||||
self.hoist_loops_impl(value, &mut loops);
|
||||
if let Some(key) = key {
|
||||
self.hoist_loops_impl(key, &mut loops);
|
||||
}
|
||||
self.hoist_loops_impl(value, &mut loops);
|
||||
self.hoist_loops_impl(collection, &mut loops);
|
||||
}
|
||||
Every {
|
||||
@@ -548,18 +548,8 @@ impl<'source> Interpreter<'source> {
|
||||
}
|
||||
true
|
||||
}
|
||||
Literal::SomeIn {
|
||||
key,
|
||||
value,
|
||||
collection,
|
||||
..
|
||||
} => {
|
||||
let value = self.eval_membership(key, value, collection)?;
|
||||
if let Value::Bool(bool) = value {
|
||||
bool
|
||||
} else {
|
||||
panic!();
|
||||
}
|
||||
Literal::SomeIn { .. } => {
|
||||
unimplemented!()
|
||||
}
|
||||
Literal::NotExpr { expr, .. } => matches!(self.eval_expr(expr)?, Value::Bool(false)),
|
||||
Literal::Every {
|
||||
@@ -861,37 +851,35 @@ impl<'source> Interpreter<'source> {
|
||||
|
||||
fn eval_membership(
|
||||
&mut self,
|
||||
key: &'source Expr<'source>,
|
||||
value: &'source Option<Expr<'source>>,
|
||||
key: &'source Option<Expr<'source>>,
|
||||
value: &'source Expr<'source>,
|
||||
collection: &'source Expr<'source>,
|
||||
) -> Result<Value> {
|
||||
let key = self.eval_expr(key)?;
|
||||
|
||||
let value = self.eval_expr(value)?;
|
||||
let collection = self.eval_expr(collection)?;
|
||||
|
||||
let result = match &collection {
|
||||
Value::Array(array) => {
|
||||
if let Some(value) = value {
|
||||
let value = self.eval_expr(value)?;
|
||||
if let Some(key) = key {
|
||||
let key = self.eval_expr(key)?;
|
||||
collection[&key] == value
|
||||
} else {
|
||||
array.iter().any(|item| *item == key)
|
||||
array.iter().any(|item| *item == value)
|
||||
}
|
||||
}
|
||||
Value::Object(object) => {
|
||||
if let Some(value) = value {
|
||||
let value = self.eval_expr(value)?;
|
||||
if let Some(key) = key {
|
||||
let key = self.eval_expr(key)?;
|
||||
collection[&key] == value
|
||||
} else {
|
||||
object.values().into_iter().any(|item| *item == key)
|
||||
object.values().into_iter().any(|item| *item == value)
|
||||
}
|
||||
}
|
||||
Value::Set(set) => {
|
||||
if value.is_some() {
|
||||
if key.is_some() {
|
||||
false
|
||||
//return Err(anyhow!("key-value pair is not supported for set"));
|
||||
} else {
|
||||
set.contains(&key)
|
||||
set.contains(&value)
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
|
||||
@@ -690,10 +690,14 @@ impl<'source> Parser<'source> {
|
||||
self.parse_future_keyword("in", false, "while parsing membership expression")?;
|
||||
let expr3 = self.parse_bool_expr()?;
|
||||
span.end = self.end;
|
||||
let (key, value) = match expr2 {
|
||||
Some(e) => (Box::new(Some(expr1)), Box::new(e)),
|
||||
None => (Box::new(None), Box::new(expr1)),
|
||||
};
|
||||
expr1 = Expr::Membership {
|
||||
span,
|
||||
key: Box::new(expr1),
|
||||
value: Box::new(expr2),
|
||||
key,
|
||||
value,
|
||||
collection: Box::new(expr3),
|
||||
};
|
||||
expr2 = None;
|
||||
@@ -856,8 +860,8 @@ impl<'source> Parser<'source> {
|
||||
}
|
||||
|
||||
let (key, value) = match refs.len() {
|
||||
2 => (refs[0].clone(), Some(refs[1].clone())),
|
||||
1 => (refs[0].clone(), None),
|
||||
2 => (Some(refs[0].clone()), refs[1].clone()),
|
||||
1 => (None, refs[0].clone()),
|
||||
_ => {
|
||||
let span = &vars[2];
|
||||
return Err(anyhow!(
|
||||
|
||||
@@ -29,7 +29,7 @@ cases:
|
||||
expr:
|
||||
var: y
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case2-array
|
||||
rego: |
|
||||
package test
|
||||
@@ -56,7 +56,7 @@ cases:
|
||||
var: y
|
||||
- number: 5
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case3-compr
|
||||
rego: |
|
||||
package test
|
||||
@@ -92,7 +92,7 @@ cases:
|
||||
set:
|
||||
- number: 5
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case4-array
|
||||
rego: |
|
||||
package test
|
||||
@@ -119,14 +119,14 @@ cases:
|
||||
rhs:
|
||||
var: y
|
||||
- inexpr:
|
||||
key:
|
||||
value:
|
||||
number: 5
|
||||
collection:
|
||||
set:
|
||||
- number: 5
|
||||
- number: 6
|
||||
- number: 6
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case5-array
|
||||
rego: |
|
||||
package test
|
||||
@@ -159,7 +159,7 @@ cases:
|
||||
rhs:
|
||||
var: y
|
||||
- inexpr:
|
||||
key:
|
||||
value:
|
||||
number: 5
|
||||
collection:
|
||||
set:
|
||||
@@ -206,4 +206,3 @@ cases:
|
||||
set:
|
||||
- number: 5
|
||||
bodies: []
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ cases:
|
||||
op: "="
|
||||
value:
|
||||
inexpr:
|
||||
key:
|
||||
value:
|
||||
number: 5
|
||||
collection:
|
||||
array:
|
||||
@@ -40,9 +40,9 @@ cases:
|
||||
op: "="
|
||||
value:
|
||||
inexpr:
|
||||
key:
|
||||
value:
|
||||
inexpr:
|
||||
key:
|
||||
value:
|
||||
number: 5
|
||||
collection:
|
||||
array:
|
||||
|
||||
@@ -39,7 +39,7 @@ cases:
|
||||
op: "="
|
||||
value:
|
||||
inexpr:
|
||||
key:
|
||||
value:
|
||||
inexpr:
|
||||
key:
|
||||
number: 0
|
||||
@@ -50,4 +50,3 @@ cases:
|
||||
collection:
|
||||
var: d
|
||||
bodies: []
|
||||
|
||||
|
||||
@@ -153,11 +153,11 @@ cases:
|
||||
string: q
|
||||
- key:
|
||||
inexpr:
|
||||
key:
|
||||
value:
|
||||
string: r
|
||||
collection:
|
||||
string: d
|
||||
value:
|
||||
string: e
|
||||
|
||||
|
||||
bodies: []
|
||||
|
||||
@@ -29,7 +29,7 @@ cases:
|
||||
expr:
|
||||
var: y
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case2-set
|
||||
rego: |
|
||||
package test
|
||||
@@ -56,7 +56,7 @@ cases:
|
||||
var: y
|
||||
- number: 5
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case3-compr
|
||||
rego: |
|
||||
package test
|
||||
@@ -92,7 +92,7 @@ cases:
|
||||
set:
|
||||
- number: 5
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case4-set
|
||||
rego: |
|
||||
package test
|
||||
@@ -119,14 +119,14 @@ cases:
|
||||
rhs:
|
||||
var: y
|
||||
- inexpr:
|
||||
key:
|
||||
value:
|
||||
number: 5
|
||||
collection:
|
||||
set:
|
||||
- number: 5
|
||||
- number: 6
|
||||
- number: 6
|
||||
bodies: []
|
||||
|
||||
|
||||
- note: case5-set
|
||||
rego: |
|
||||
package test
|
||||
@@ -159,7 +159,7 @@ cases:
|
||||
rhs:
|
||||
var: y
|
||||
- inexpr:
|
||||
key:
|
||||
value:
|
||||
number: 5
|
||||
collection:
|
||||
set:
|
||||
@@ -206,4 +206,3 @@ cases:
|
||||
set:
|
||||
- number: 5
|
||||
bodies: []
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ cases:
|
||||
- span: some a in {1}
|
||||
literal:
|
||||
some-decl:
|
||||
key:
|
||||
value:
|
||||
var: a
|
||||
collection:
|
||||
set:
|
||||
@@ -140,8 +140,8 @@ cases:
|
||||
y = a
|
||||
}
|
||||
error: expecting `}` while parsing query
|
||||
|
||||
- note: multi-line-parsed as membership
|
||||
|
||||
- note: multi-line-parsed-as-membership
|
||||
rego: |
|
||||
package test
|
||||
import future.keywords.in
|
||||
@@ -165,7 +165,7 @@ cases:
|
||||
assign:
|
||||
op: :=
|
||||
value:
|
||||
number: 5
|
||||
number: 5
|
||||
bodies: []
|
||||
- spec:
|
||||
head:
|
||||
@@ -189,7 +189,7 @@ cases:
|
||||
expr:
|
||||
inexpr:
|
||||
span: b in {4, 5}
|
||||
key:
|
||||
value:
|
||||
var: b
|
||||
collection:
|
||||
set:
|
||||
@@ -221,6 +221,3 @@ cases:
|
||||
var: y
|
||||
rhs:
|
||||
var: a
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -226,8 +226,8 @@ fn match_expr_impl(e: &Expr, v: &Value) -> Result<()> {
|
||||
collection,
|
||||
} => {
|
||||
match_span_opt(span, &v["inexpr"]["span"])?;
|
||||
match_expr(key, &v["inexpr"]["key"])?;
|
||||
match_expr_opt(span, value, &v["inexpr"]["value"])?;
|
||||
match_expr_opt(span, key, &v["inexpr"]["key"])?;
|
||||
match_expr(value, &v["inexpr"]["value"])?;
|
||||
match_expr(collection, &v["inexpr"]["collection"])
|
||||
}
|
||||
}
|
||||
@@ -494,8 +494,8 @@ fn match_literal(l: &Literal, v: &Value) -> Result<()> {
|
||||
} => {
|
||||
let v = &v["some-decl"];
|
||||
match_span_opt(span, &v["span"])?;
|
||||
match_expr(key, &v["key"])?;
|
||||
match_expr_opt(span, value, &v["value"])?;
|
||||
match_expr(value, &v["value"])?;
|
||||
match_expr_opt(span, key, &v["key"])?;
|
||||
match_expr(collection, &v["collection"])
|
||||
}
|
||||
Literal::Expr { expr, .. } => match_expr(expr, &v["expr"]),
|
||||
|
||||
Reference in New Issue
Block a user