Struct cedar_policy_core::ast::Expr

source ·
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>

source

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.

source

pub fn into_expr_kind(self) -> ExprKind<T>

Access the inner ExprKind, taking ownership.

source

pub fn data(&self) -> &T

Access the data stored on the Expr.

source

pub fn into_data(self) -> T

Access the data stored on the Expr, taking ownership.

source

pub fn source_info(&self) -> &Option<SourceInfo>

Access the data stored on the Expr.

source

pub fn into_source_info(self) -> Option<SourceInfo>

Access the data stored on the Expr, taking ownership.

source

pub fn set_data(&mut self, data: T)

Update the data for this Expr. A convenient function used by the Validator in one place.

source

pub fn is_ref(&self) -> bool

Check whether this expression is an entity reference

This is used for policy headers, where some syntax is required to be an entity reference.

source

pub fn is_slot(&self) -> bool

Check whether this expression is a slot.

source

pub fn is_ref_set(&self) -> bool

Check whether this expression is a set of entity references

This is used for policy headers, where some syntax is required to be an entity reference set.

source

pub fn subexpressions(&self) -> impl Iterator<Item = &Self>

Iterate over all sub-expressions in this expression

source

pub fn slots(&self) -> impl Iterator<Item = &SlotId>

Iterate over all of the slots in this policy AST

source

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

source§

impl Expr

source

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 i64, a String, etc.

source

pub fn unknown(name: impl Into<SmolStr>) -> Self

Create an unknown value

source

pub fn unknown_with_type(name: impl Into<SmolStr>, t: Option<Type>) -> Self

Create an unknown value, with an optional type annotation

source

pub fn var(v: Var) -> Self

Create an Expr that’s just this literal Var

source

pub fn slot(s: SlotId) -> Self

Create an Expr that’s just this SlotId

source

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

source

pub fn not(e: Expr) -> Self

Create a ‘not’ expression. e must evaluate to Bool type

source

pub fn is_eq(e1: Expr, e2: Expr) -> Self

Create a ‘==’ expression

source

pub fn noteq(e1: Expr, e2: Expr) -> Self

Create a ‘!=’ expression

source

pub fn and(e1: Expr, e2: Expr) -> Self

Create an ‘and’ expression. Arguments must evaluate to Bool type

source

pub fn or(e1: Expr, e2: Expr) -> Self

Create an ‘or’ expression. Arguments must evaluate to Bool type

source

pub fn less(e1: Expr, e2: Expr) -> Self

Create a ‘<’ expression. Arguments must evaluate to Long type

source

pub fn lesseq(e1: Expr, e2: Expr) -> Self

Create a ‘<=’ expression. Arguments must evaluate to Long type

source

pub fn greater(e1: Expr, e2: Expr) -> Self

Create a ‘>’ expression. Arguments must evaluate to Long type

source

pub fn greatereq(e1: Expr, e2: Expr) -> Self

Create a ‘>=’ expression. Arguments must evaluate to Long type

source

pub fn add(e1: Expr, e2: Expr) -> Self

Create an ‘add’ expression. Arguments must evaluate to Long type

source

pub fn sub(e1: Expr, e2: Expr) -> Self

Create a ‘sub’ expression. Arguments must evaluate to Long type

source

pub fn mul(e1: Expr, e2: Expr) -> Self

Create a ‘mul’ expression. Arguments must evaluate to Long type

source

pub fn neg(e: Expr) -> Self

Create a ‘neg’ expression. e must evaluate to Long type.

source

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.

source

pub fn contains(e1: Expr, e2: Expr) -> Self

Create a ‘contains’ expression. First argument must have Set type.

source

pub fn contains_all(e1: Expr, e2: Expr) -> Self

Create a ‘contains_all’ expression. Arguments must evaluate to Set type

source

pub fn contains_any(e1: Expr, e2: Expr) -> Self

Create an ‘contains_any’ expression. Arguments must evaluate to Set type

source

pub fn set(exprs: impl IntoIterator<Item = Expr>) -> Self

Create an Expr which evaluates to a Set of the given Exprs

source

pub fn record(pairs: impl IntoIterator<Item = (SmolStr, Expr)>) -> Self

Create an Expr which evaluates to a Record with the given (key, value) pairs.

source

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

source

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

source

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

source

pub fn get_attr(expr: Expr, attr: SmolStr) -> Self

Create an Expr which gets the attribute of some Entity or the field of some record.

expr must evaluate to either Entity or Record type

source

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 field on a given record.

expr must evaluate to either Entity or Record type

source

pub fn like(expr: Expr, pattern: impl IntoIterator<Item = PatternElem>) -> Self

Create a ‘like’ expression.

expr must evaluate to a String type

source

pub fn is_unknown(&self) -> bool

Check if an expression contains any symbolic unknowns

source

pub fn unknowns(&self) -> impl Iterator<Item = &str>

Get all unknowns in an expression

source

pub fn substitute( &self, definitions: &HashMap<SmolStr, Value>, ) -> Result<Expr, SubstitutionError>

Substitute unknowns with values If a definition is missing, it will be left as an unknown, and can be filled in later.

source§

impl<T> Expr<T>

source

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.

source

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>

source§

fn as_ref(&self) -> &'a Expr

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl AsRef<Expr> for RestrictedExpr

source§

fn as_ref(&self) -> &Expr

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<T: Clone> Clone for Expr<T>

source§

fn clone(&self) -> Expr<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T: Debug> Debug for Expr<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

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>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Expr

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'a> From<BorrowedRestrictedExpr<'a>> for &'a Expr

source§

fn from(r: BorrowedRestrictedExpr<'a>) -> &'a Expr

Converts to this type from the input type.
source§

impl From<Expr> for Clause

source§

fn from(expr: Expr) -> Clause

Converts to this type from the input type.
source§

impl From<Expr> for Expr

source§

fn from(expr: Expr) -> Expr

Converts to this type from the input type.
source§

impl From<Expr> for PartialValue

source§

fn from(e: Expr) -> Self

Converts to this type from the input type.
source§

impl From<ExtensionValueWithArgs> for Expr

source§

fn from(val: ExtensionValueWithArgs) -> Self

Converts to this type from the input type.
source§

impl From<PartialValue> for Expr

source§

fn from(val: PartialValue) -> Self

Converts to this type from the input type.
source§

impl From<RestrictedExpr> for Expr

source§

fn from(r: RestrictedExpr) -> Expr

Converts to this type from the input type.
source§

impl From<Value> for Expr

source§

fn from(v: Value) -> Self

Converts to this type from the input type.
source§

impl FromStr for Expr

source§

type Err = ParseErrors

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<Expr, Self::Err>

Parses a string s to return a value of this type. Read more
source§

impl<T: Hash> Hash for Expr<T>

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<T: PartialEq> PartialEq for Expr<T>

source§

fn eq(&self, other: &Expr<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T> Serialize for Expr<T>
where T: Serialize,

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl TryFrom<Clause> for Expr

source§

type Error = EstToAstError

The type returned in the event of a conversion error.
source§

fn try_from(clause: Clause) -> Result<Expr, EstToAstError>

Performs the conversion.
source§

impl TryFrom<Expr> for Expr

source§

type Error = EstToAstError

The type returned in the event of a conversion error.
source§

fn try_from(expr: Expr) -> Result<Expr, EstToAstError>

Performs the conversion.
source§

impl TryFrom<Expr> for Value

source§

type Error = NotValue

The type returned in the event of a conversion error.
source§

fn try_from(value: Expr) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<T: Eq> Eq for Expr<T>

source§

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>
where T: Send + Sync,

§

impl<T> Sync for Expr<T>
where T: Sync + Send,

§

impl<T> Unpin for Expr<T>
where T: Unpin,

§

impl<T> UnwindSafe for Expr<T>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToSmolStr for T
where T: Display + ?Sized,

source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,