Skip to main content

Expression

Struct Expression 

Source
pub struct Expression { /* private fields */ }
Expand description

Expression.

Expressions allow to build trees of Id and Selector instances combined with logical operators, enabling complex matching and filtering.

The following operators are supported:

§Examples

use zrx_id::{selector, Expression};

// Create expression
let expr = Expression::all(|expr| {
    expr.with(selector!(location = "**/*.md")?)?
        .with(Expression::not(|expr| {
            expr.with(selector!(provider = "file")?)
        })
    )
})?;

Implementations§

Source§

impl Expression

Source

pub fn any<F>(f: F) -> Result<Self>
where F: FnOnce(Builder) -> Result<Builder>,

Creates an expression for which any operand must match.

§Errors

Returns Error::Id if any of the operands are invalid.

§Examples
use zrx_id::{selector, Expression};

// Create expression
let expr = Expression::any(|expr| {
    expr.with(selector!(location = "**/*.jpg")?)?
        .with(selector!(location = "**/*.png")?)
})?;
Source

pub fn all<F>(f: F) -> Result<Self>
where F: FnOnce(Builder) -> Result<Builder>,

Creates an expression for which all operands must match.

§Errors

Returns Error::Id if any of the operands are invalid.

§Examples
use zrx_id::{selector, Expression};

// Create expression
let expr = Expression::all(|expr| {
    expr.with(selector!(location = "**/*.md")?)?
        .with(selector!(provider = "file")?)
})?;
Source

pub fn not<F>(f: F) -> Result<Self>
where F: FnOnce(Builder) -> Result<Builder>,

Creates an expression for which no operand must match.

§Errors

Returns Error::Id if any of the operands are invalid.

§Examples
use zrx_id::{selector, Expression};

// Create expression
let expr = Expression::all(|expr| {
    expr.with(selector!(location = "**/*.md")?)?
        .with(Expression::not(|expr| {
            expr.with(selector!(provider = "file")?)
        })
    )
})?;
Source§

impl Expression

Source

pub fn operator(&self) -> Operator

Returns the operator.

Source

pub fn operands(&self) -> &[Operand]

Returns a reference to the operands.

Source

pub fn len(&self) -> usize

Returns the number of operands.

Source

pub fn is_empty(&self) -> bool

Returns whether there are any operands.

Trait Implementations§

Source§

impl Clone for Expression

Source§

fn clone(&self) -> Expression

Returns a duplicate 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 Debug for Expression

Source§

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

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

impl Default for Expression

Source§

fn default() -> Self

Creates an expression that matches everything.

While it may seem counterintuitive to have the default expression match everything, it is designed this way to align with the concept of vacuous truth in logic. An expression with no operands is considered to be true, as there are no conditions to violate it.

In our implementation, we use an empty expression with a logical NOT operator to represent this concept, to be distinguishable as a marker.

§Examples
use zrx_id::Expression;

// Create empty expression
let expr = Expression::default();
assert!(expr.is_empty());
Source§

impl From<Expression> for Operand

Source§

fn from(expr: Expression) -> Self

Creates an operand from an expression.

Source§

impl<T> From<T> for Expression
where T: Into<Term>,

Source§

fn from(term: T) -> Self

Creates an expression from a term.

Source§

impl IntoIterator for Expression

Source§

fn into_iter(self) -> Self::IntoIter

Creates a consuming iterator over the expression.

§Examples
use zrx_id::{selector, Expression};

// Create expression
let expr = Expression::any(|expr| {
    expr.with(selector!(location = "**/*.jpg")?)?
        .with(selector!(location = "**/*.png")?)
})?;

// Create iterator over expression
for operand in expr {
    println!("{operand:?}");
}
Source§

type Item = Operand

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<<Expression as IntoIterator>::Item>

Which kind of iterator are we turning this into?
Source§

impl PartialEq for Expression

Source§

fn eq(&self, other: &Expression) -> 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 ToSpecificity for Expression

Source§

fn to_specificity(&self) -> Specificity

Computes the specificity of the expression.

§Examples
use zrx_id::specificity::ToSpecificity;
use zrx_id::{selector, Expression};

// Create expression and compute specificity
let expr = Expression::any(|expr| {
    expr.with(selector!(location = "**/*.jpg")?)?
        .with(selector!(location = "**/*.png")?)
})?;
assert_eq!(expr.to_specificity(), (0, 1, 1, 4).into());
Source§

impl Eq for Expression

Source§

impl StructuralPartialEq for Expression

Auto Trait Implementations§

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, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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<K, V> TryAsStorage<K> for V
where K: Key, V: Value,

Source§

fn try_as_storage( item: &(dyn Any + 'static), ) -> Result<<V as TryAsStorage<K>>::Target<'_>, Error>

Attempts to convert into a storage reference.

§Errors

The following errors might be returned:

§Examples
use std::any::Any;
use zrx_storage::convert::TryAsStorage;
use zrx_storage::Storage;

// Create storage and initial state
let mut storage = Storage::default();
storage.insert("key", 42);

// Obtain type-erased reference
let item: &dyn Any = &storage;

// Obtain storage reference
let storage = <i32>::try_as_storage(item)?;
Source§

type Target<'a> = &'a Storage<K, V>

Target type of conversion.
Source§

impl<K, V> TryAsStorageMut<K> for V
where K: Key, V: Value,

Source§

fn try_as_storage_mut( item: &mut (dyn Any + 'static), ) -> Result<<V as TryAsStorageMut<K>>::Target<'_>, Error>

Attempts to convert into a mutable storage reference.

§Errors

The following errors might be returned:

§Examples
use std::any::Any;
use zrx_storage::convert::TryAsStorageMut;
use zrx_storage::Storage;

// Create storage and initial state
let mut storage = Storage::default();
storage.insert("key", 42);

// Obtain mutable type-erased reference
let item: &mut dyn Any = &mut storage;

// Obtain mutable storage reference
let storage = <i32>::try_as_storage_mut(item)?;
Source§

type Target<'a> = &'a mut Storage<K, V>

Target type of conversion.
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> Value for T
where T: Debug + Eq + 'static,