// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. use crate::lexer::*; #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum BinOp { And, Or, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum ArithOp { Add, Sub, Mul, Div, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum BoolOp { Lt, Le, Eq, Ge, Gt, Ne, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum AssignOp { Eq, ColEq, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum Expr<'source> { // Simple items that only have a span as content. String(Span<'source>), RawString(Span<'source>), Number(Span<'source>), True(Span<'source>), False(Span<'source>), Null(Span<'source>), Var(Span<'source>), // array Array { span: Span<'source>, items: Vec>, }, // set Set { span: Span<'source>, items: Vec>, }, Object { span: Span<'source>, fields: Vec<(Span<'source>, Expr<'source>, Expr<'source>)>, }, // Comprehensions ArrayCompr { span: Span<'source>, term: Box>, query: Query<'source>, }, SetCompr { span: Span<'source>, term: Box>, query: Query<'source>, }, ObjectCompr { span: Span<'source>, key: Box>, value: Box>, query: Query<'source>, }, Call { span: Span<'source>, fcn: Box>, params: Vec>, }, UnaryExpr { span: Span<'source>, expr: Box>, }, // ref RefDot { span: Span<'source>, refr: Box>, field: Span<'source>, }, RefBrack { span: Span<'source>, refr: Box>, index: Box>, }, // Infix expressions BinExpr { span: Span<'source>, op: BinOp, lhs: Box>, rhs: Box>, }, BoolExpr { span: Span<'source>, op: BoolOp, lhs: Box>, rhs: Box>, }, ArithExpr { span: Span<'source>, op: ArithOp, lhs: Box>, rhs: Box>, }, AssignExpr { span: Span<'source>, op: AssignOp, lhs: Box>, rhs: Box>, }, Membership { span: Span<'source>, key: Box>, value: Box>>, collection: Box>, }, } impl<'source> Expr<'source> { pub fn span(&self) -> &Span<'source> { use Expr::*; match self { String(s) | RawString(s) | Number(s) | True(s) | False(s) | Null(s) | Var(s) => s, Array { span, .. } | Set { span, .. } | Object { span, .. } | ArrayCompr { span, .. } | SetCompr { span, .. } | ObjectCompr { span, .. } | Call { span, .. } | UnaryExpr { span, .. } | RefDot { span, .. } | RefBrack { span, .. } | BinExpr { span, .. } | BoolExpr { span, .. } | ArithExpr { span, .. } | AssignExpr { span, .. } | Membership { span, .. } => span, } } } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum Literal<'source> { SomeVars { span: Span<'source>, vars: Vec>, }, SomeIn { span: Span<'source>, key: Expr<'source>, value: Option>, collection: Expr<'source>, }, Expr { span: Span<'source>, expr: Expr<'source>, }, NotExpr { span: Span<'source>, expr: Expr<'source>, }, Every { span: Span<'source>, key: Span<'source>, value: Option>, domain: Expr<'source>, query: Query<'source>, }, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct WithModifier<'source> { pub span: Span<'source>, pub refr: Expr<'source>, pub r#as: Expr<'source>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct LiteralStmt<'source> { pub span: Span<'source>, pub literal: Literal<'source>, pub with_mods: Vec>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct Query<'source> { pub span: Span<'source>, pub stmts: Vec>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct RuleAssign<'source> { pub span: Span<'source>, pub op: AssignOp, pub value: Expr<'source>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct RuleBody<'source> { pub span: Span<'source>, pub assign: Option>, pub query: Query<'source>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum RuleHead<'source> { Compr { span: Span<'source>, refr: Expr<'source>, assign: Option>, }, Set { span: Span<'source>, refr: Expr<'source>, key: Option>, }, Func { span: Span<'source>, refr: Expr<'source>, args: Vec>, assign: Option>, }, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum Rule<'source> { Spec { span: Span<'source>, head: RuleHead<'source>, bodies: Vec>, }, Default { span: Span<'source>, refr: Expr<'source>, op: AssignOp, value: Expr<'source>, }, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct Package<'source> { pub span: Span<'source>, pub refr: Expr<'source>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct Import<'source> { pub span: Span<'source>, pub refr: Expr<'source>, pub r#as: Option>, } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct Module<'source> { pub package: Package<'source>, pub imports: Vec>, pub policy: Vec>, }