pub struct Expr<T = ()> { /* private fields */ }
Expand description
Internal AST for expressions used by the policy evaluator.
This structure is a wrapper around an ExprKind
, which is the expression
variant this object contains. It also contains source information about
where the expression was written in policy source code, and some generic
data which is stored on each node of the AST.
Cloning is O(1).
Implementations§
Source§impl<T> Expr<T>
impl<T> Expr<T>
Sourcepub fn expr_kind(&self) -> &ExprKind<T>
pub fn expr_kind(&self) -> &ExprKind<T>
Access the inner ExprKind
for this Expr
. The ExprKind
is the
enum
which specifies the expression variant, so it must be accessed by
any code matching and recursing on an expression.
Sourcepub fn into_expr_kind(self) -> ExprKind<T>
pub fn into_expr_kind(self) -> ExprKind<T>
Access the inner ExprKind
, taking ownership and consuming the Expr
.
Sourcepub fn into_data(self) -> T
pub fn into_data(self) -> T
Access the data stored on the Expr
, taking ownership and consuming the
Expr
.
Sourcepub fn source_loc(&self) -> Option<&Loc>
pub fn source_loc(&self) -> Option<&Loc>
Access the Loc
stored on the Expr
.
Sourcepub fn with_maybe_source_loc(self, source_loc: Option<Loc>) -> Self
pub fn with_maybe_source_loc(self, source_loc: Option<Loc>) -> Self
Return the Expr
, but with the new source_loc
(or None
).
Sourcepub fn set_data(&mut self, data: T)
pub fn set_data(&mut self, data: T)
Update the data for this Expr
. A convenient function used by the
Validator in one place.
Sourcepub fn is_ref(&self) -> bool
pub fn is_ref(&self) -> bool
Check whether this expression is an entity reference
This is used for policy scopes, where some syntax is required to be an entity reference.
Sourcepub fn is_ref_set(&self) -> bool
pub fn is_ref_set(&self) -> bool
Check whether this expression is a set of entity references
This is used for policy scopes, where some syntax is required to be an entity reference set.
Sourcepub fn subexpressions(&self) -> impl Iterator<Item = &Self>
pub fn subexpressions(&self) -> impl Iterator<Item = &Self>
Iterate over all sub-expressions in this expression
Sourcepub fn slots(&self) -> impl Iterator<Item = Slot> + '_
pub fn slots(&self) -> impl Iterator<Item = Slot> + '_
Iterate over all of the slots in this policy AST
Sourcepub fn is_projectable(&self) -> bool
pub fn is_projectable(&self) -> bool
Determine if the expression is projectable under partial evaluation An expression is projectable if it’s guaranteed to never error on evaluation This is true if the expression is entirely composed of values or unknowns
Sourcepub fn try_type_of(&self, extensions: &Extensions<'_>) -> Option<Type>
pub fn try_type_of(&self, extensions: &Extensions<'_>) -> Option<Type>
Try to compute the runtime type of this expression. This operation may
fail (returning None
), for example, when asked to get the type of any
variables, any attributes of entities or records, or an unknown
without an explicitly annotated type.
Also note that this is not typechecking the expression. It does not check that the expression actually evaluates to a value (as opposed to erroring).
Because of these limitations, this function should only be used to obtain a type for use in diagnostics such as error strings.
Source§impl Expr
impl Expr
Sourcepub fn val(v: impl Into<Literal>) -> Self
pub fn val(v: impl Into<Literal>) -> Self
Create an Expr
that’s just a single Literal
.
Note that you can pass this a Literal
, an Integer
, a String
, etc.
Sourcepub fn ite(test_expr: Expr, then_expr: Expr, else_expr: Expr) -> Self
pub fn ite(test_expr: Expr, then_expr: Expr, else_expr: Expr) -> Self
Create a ternary (if-then-else) Expr
.
test_expr
must evaluate to a Bool type
Sourcepub fn ite_arc(
test_expr: Arc<Expr>,
then_expr: Arc<Expr>,
else_expr: Arc<Expr>,
) -> Self
pub fn ite_arc( test_expr: Arc<Expr>, then_expr: Arc<Expr>, else_expr: Arc<Expr>, ) -> Self
Create a ternary (if-then-else) Expr
.
Takes Arc
s instead of owned Expr
s.
test_expr
must evaluate to a Bool type
Sourcepub fn and(e1: Expr, e2: Expr) -> Self
pub fn and(e1: Expr, e2: Expr) -> Self
Create an ‘and’ expression. Arguments must evaluate to Bool type
Sourcepub fn or(e1: Expr, e2: Expr) -> Self
pub fn or(e1: Expr, e2: Expr) -> Self
Create an ‘or’ expression. Arguments must evaluate to Bool type
Sourcepub fn less(e1: Expr, e2: Expr) -> Self
pub fn less(e1: Expr, e2: Expr) -> Self
Create a ‘<’ expression. Arguments must evaluate to Long type
Sourcepub fn lesseq(e1: Expr, e2: Expr) -> Self
pub fn lesseq(e1: Expr, e2: Expr) -> Self
Create a ‘<=’ expression. Arguments must evaluate to Long type
Sourcepub fn greater(e1: Expr, e2: Expr) -> Self
pub fn greater(e1: Expr, e2: Expr) -> Self
Create a ‘>’ expression. Arguments must evaluate to Long type
Sourcepub fn greatereq(e1: Expr, e2: Expr) -> Self
pub fn greatereq(e1: Expr, e2: Expr) -> Self
Create a ‘>=’ expression. Arguments must evaluate to Long type
Sourcepub fn add(e1: Expr, e2: Expr) -> Self
pub fn add(e1: Expr, e2: Expr) -> Self
Create an ‘add’ expression. Arguments must evaluate to Long type
Sourcepub fn sub(e1: Expr, e2: Expr) -> Self
pub fn sub(e1: Expr, e2: Expr) -> Self
Create a ‘sub’ expression. Arguments must evaluate to Long type
Sourcepub fn mul(e1: Expr, e2: Expr) -> Self
pub fn mul(e1: Expr, e2: Expr) -> Self
Create a ‘mul’ expression. Arguments must evaluate to Long type
Sourcepub fn is_in(e1: Expr, e2: Expr) -> Self
pub fn is_in(e1: Expr, e2: Expr) -> Self
Create an ‘in’ expression. First argument must evaluate to Entity type. Second argument must evaluate to either Entity type or Set type where all set elements have Entity type.
Sourcepub fn contains(e1: Expr, e2: Expr) -> Self
pub fn contains(e1: Expr, e2: Expr) -> Self
Create a contains
expression.
First argument must have Set type.
Sourcepub fn contains_all(e1: Expr, e2: Expr) -> Self
pub fn contains_all(e1: Expr, e2: Expr) -> Self
Create a containsAll
expression. Arguments must evaluate to Set type
Sourcepub fn contains_any(e1: Expr, e2: Expr) -> Self
pub fn contains_any(e1: Expr, e2: Expr) -> Self
Create a containsAny
expression. Arguments must evaluate to Set type
Sourcepub fn get_tag(expr: Expr, tag: Expr) -> Self
pub fn get_tag(expr: Expr, tag: Expr) -> Self
Create a getTag
expression.
expr
must evaluate to Entity type, tag
must evaluate to String type.
Sourcepub fn has_tag(expr: Expr, tag: Expr) -> Self
pub fn has_tag(expr: Expr, tag: Expr) -> Self
Create a hasTag
expression.
expr
must evaluate to Entity type, tag
must evaluate to String type.
Sourcepub fn set(exprs: impl IntoIterator<Item = Expr>) -> Self
pub fn set(exprs: impl IntoIterator<Item = Expr>) -> Self
Create an Expr
which evaluates to a Set of the given Expr
s
Sourcepub fn record(
pairs: impl IntoIterator<Item = (SmolStr, Expr)>,
) -> Result<Self, ExpressionConstructionError>
pub fn record( pairs: impl IntoIterator<Item = (SmolStr, Expr)>, ) -> Result<Self, ExpressionConstructionError>
Create an Expr
which evaluates to a Record with the given (key, value) pairs.
Sourcepub fn record_arc(map: Arc<BTreeMap<SmolStr, Expr>>) -> Self
pub fn record_arc(map: Arc<BTreeMap<SmolStr, Expr>>) -> Self
Create an Expr
which evaluates to a Record with the given key-value mapping.
If you have an iterator of pairs, generally prefer calling
Expr::record()
instead of .collect()
-ing yourself and calling this,
potentially for efficiency reasons but also because Expr::record()
will properly handle duplicate keys but your own .collect()
will not
(by default).
Sourcepub fn call_extension_fn(fn_name: Name, args: Vec<Expr>) -> Self
pub fn call_extension_fn(fn_name: Name, args: Vec<Expr>) -> Self
Create an Expr
which calls the extension function with the given
Name
on args
Sourcepub fn unary_app(op: impl Into<UnaryOp>, arg: Expr) -> Self
pub fn unary_app(op: impl Into<UnaryOp>, arg: Expr) -> Self
Create an application Expr
which applies the given built-in unary
operator to the given arg
Sourcepub fn binary_app(op: impl Into<BinaryOp>, arg1: Expr, arg2: Expr) -> Self
pub fn binary_app(op: impl Into<BinaryOp>, arg1: Expr, arg2: Expr) -> Self
Create an application Expr
which applies the given built-in binary
operator to arg1
and arg2
Sourcepub fn get_attr(expr: Expr, attr: SmolStr) -> Self
pub fn get_attr(expr: Expr, attr: SmolStr) -> Self
Create an Expr
which gets a given attribute of a given Entity
or record.
expr
must evaluate to either Entity or Record type
Sourcepub fn has_attr(expr: Expr, attr: SmolStr) -> Self
pub fn has_attr(expr: Expr, attr: SmolStr) -> Self
Create an Expr
which tests for the existence of a given
attribute on a given Entity
or record.
expr
must evaluate to either Entity or Record type
Sourcepub fn like(expr: Expr, pattern: impl IntoIterator<Item = PatternElem>) -> Self
pub fn like(expr: Expr, pattern: impl IntoIterator<Item = PatternElem>) -> Self
Create a ‘like’ expression.
expr
must evaluate to a String type
Sourcepub fn is_entity_type(expr: Expr, entity_type: EntityType) -> Self
pub fn is_entity_type(expr: Expr, entity_type: EntityType) -> Self
Create an is
expression.
Sourcepub fn contains_unknown(&self) -> bool
pub fn contains_unknown(&self) -> bool
Check if an expression contains any symbolic unknowns
Sourcepub fn substitute(&self, definitions: &HashMap<SmolStr, Value>) -> Expr
pub fn substitute(&self, definitions: &HashMap<SmolStr, Value>) -> Expr
Substitute unknowns with concrete values.
Ignores unmapped unknowns. Ignores type annotations on unknowns.
Sourcepub fn substitute_typed(
&self,
definitions: &HashMap<SmolStr, Value>,
) -> Result<Expr, SubstitutionError>
pub fn substitute_typed( &self, definitions: &HashMap<SmolStr, Value>, ) -> Result<Expr, SubstitutionError>
Substitute unknowns with concrete values.
Ignores unmapped unknowns. Errors if the substituted value does not match the type annotation on the unknown.
Source§impl<T> Expr<T>
impl<T> Expr<T>
Sourcepub fn eq_shape<U>(&self, other: &Expr<U>) -> bool
pub fn eq_shape<U>(&self, other: &Expr<U>) -> bool
Return true if this expression (recursively) has the same expression
kind as the argument expression. This accounts for the full recursive
shape of the expression, but does not consider source information or any
generic data annotated on expression. This should behave the same as the
default implementation of Eq
before source information and generic
data were added.
Sourcepub fn hash_shape<H>(&self, state: &mut H)where
H: Hasher,
pub fn hash_shape<H>(&self, state: &mut H)where
H: Hasher,
Implementation of hashing corresponding to equality as implemented by
eq_shape
. Must satisfy the usual relationship between equality and
hashing.
Trait Implementations§
Source§impl<'a> AsRef<Expr> for BorrowedRestrictedExpr<'a>
impl<'a> AsRef<Expr> for BorrowedRestrictedExpr<'a>
Source§impl AsRef<Expr> for RestrictedExpr
impl AsRef<Expr> for RestrictedExpr
Source§impl<'de, T> Deserialize<'de> for Expr<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Expr<T>where
T: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'a> From<BorrowedRestrictedExpr<'a>> for &'a Expr
impl<'a> From<BorrowedRestrictedExpr<'a>> for &'a Expr
Source§fn from(r: BorrowedRestrictedExpr<'a>) -> &'a Expr
fn from(r: BorrowedRestrictedExpr<'a>) -> &'a Expr
Source§impl From<Expr> for PartialValue
impl From<Expr> for PartialValue
Source§impl From<ExtensionValueWithArgs> for Expr
impl From<ExtensionValueWithArgs> for Expr
Source§fn from(val: ExtensionValueWithArgs) -> Self
fn from(val: ExtensionValueWithArgs) -> Self
Source§impl From<PartialValue> for Expr
impl From<PartialValue> for Expr
Source§fn from(pv: PartialValue) -> Self
fn from(pv: PartialValue) -> Self
Source§impl From<RestrictedExpr> for Expr
impl From<RestrictedExpr> for Expr
Source§fn from(r: RestrictedExpr) -> Expr
fn from(r: RestrictedExpr) -> Expr
impl<T: Eq> Eq for Expr<T>
impl<T> StructuralPartialEq for Expr<T>
Auto Trait Implementations§
impl<T> Freeze for Expr<T>where
T: Freeze,
impl<T> RefUnwindSafe for Expr<T>where
T: RefUnwindSafe,
impl<T> Send for Expr<T>
impl<T> Sync for Expr<T>
impl<T> Unpin for Expr<T>where
T: Unpin,
impl<T> UnwindSafe for Expr<T>where
T: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more