Enum Equality

Source
pub enum Equality {
    Equal(Relational, Relational),
    NotEqual(Relational, Relational),
    Primary(Box<Primary>),
}
Expand description

An equality expression node in the abstract syntax tree.

Represents an equality comparison (=, !=) or a lower-precedence expression that has been flattened in the AST. This enum is part of the AIMX expression hierarchy and implements the ExpressionLike trait.

§AST Flattening

The Primary variant represents an optimization where expressions that don’t contain equality operators are flattened to reduce AST depth and improve evaluation performance. This flattening occurs during parsing when an expression doesn’t contain any equality operators.

§Variants

§Equal(Relational, Relational)

Represents an equality comparison using the = or == operator. The operands are Relational expressions, which have higher precedence.

§NotEqual(Relational, Relational)

Represents an inequality comparison using the != operator. The operands are Relational expressions, which have higher precedence.

§Primary(Primary)

A flattened primary expression for optimization. This variant is used when the expression doesn’t contain any equality operators.

§Examples

use aimx::expressions::{
    equality::Equality,
    relational::Relational,
    primary::Primary,
};
use aimx::{Literal, ExpressionLike, Context};

// This demonstrates how equality expressions can be constructed
// In practice, these would be parsed from text expressions

// Create an equality expression conceptually like: 5 = 5
// Create an inequality expression conceptually like: 5 != 10

§See Also

Variants§

§

Equal(Relational, Relational)

§

NotEqual(Relational, Relational)

§

Primary(Box<Primary>)

Primary flattened AST optimization

Trait Implementations§

Source§

impl Clone for Equality

Source§

fn clone(&self) -> Equality

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 Equality

Source§

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

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

impl Display for Equality

Source§

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

Format this equality expression as a string.

This implementation delegates to the write method using a string-based writer with default formatting. The output is suitable for display purposes and debugging.

§Format

The formatting follows these conventions:

  • Operators are surrounded by spaces: 5 = 5, 5 != 10
  • Complex expressions are properly parenthesized
  • Literals are formatted according to their type
  • Variables and references are displayed as-is
§Examples
use aimx::expressions::equality::{Equality, parse_equality};

let expr = parse_equality("5 = 5").unwrap().1;
assert_eq!(expr.to_string(), "5 = 5");

let expr = parse_equality("x > 0 = y < 10").unwrap().1;
assert_eq!(expr.to_string(), "x > 0 = y < 10");

let expr = parse_equality("5").unwrap().1;
assert_eq!(expr.to_string(), "5");
§See Also
Source§

impl ExpressionLike for Equality

Source§

fn evaluate(&self, context: &mut dyn ContextLike) -> Result<Value>

Evaluate this equality expression within the given context.

This method implements the core evaluation logic for equality expressions. It handles both equality (=) and inequality (!=) comparisons, using type promotion to ensure both operands have compatible types.

§Evaluation Strategy
  1. Equality Comparison (Equality::Equal):

    • Evaluates both operands using evaluate_and_promote
    • Promotes the right operand to match the left operand’s type
    • Compares values of the same type using == operator
    • Returns true if equal, false otherwise
  2. Inequality Comparison (Equality::NotEqual):

    • Evaluates both operands using evaluate_and_promote
    • Promotes the right operand to match the left operand’s type
    • Compares values of the same type using != operator
    • Returns true if not equal, false otherwise
  3. Flattened Expression (Equality::Primary):

    • Delegates evaluation to the underlying primary expression
§Type Support

Equality operations support these value types:

  • Bool - Boolean equality comparison
  • Date - DateTime equality comparison
  • Number - Numeric equality comparison
  • Text - String equality comparison
  • Task - Task status equality comparison
§Error Handling

Returns an error if:

  • Type promotion fails (incompatible types)
  • Either operand evaluation fails
  • Comparison of unsupported types is attempted

Error messages include type information and the original formula:

"Expected Bool, Date, Number, Task or Text, found Type1 = Type2 ~formula"
§Arguments
  • context - The evaluation context providing variable values and function implementations
§Returns

Returns a Result<Value> containing:

  • Value::Literal(Literal::Bool(true)) if comparison evaluates to true
  • Value::Literal(Literal::Bool(false)) if comparison evaluates to false
  • An error if evaluation fails
§Examples
use aimx::expressions::equality::{Equality, parse_equality};
use aimx::{ExpressionLike, Context, Literal, Value};

let mut context = Context::new();

// Evaluate equality: 5 = 5
let expr = parse_equality("5 = 5").unwrap().1;
let result = expr.evaluate(&mut context).unwrap();
assert_eq!(result, Value::Literal(Literal::Bool(true)));

// Evaluate inequality: 5 != 10
let expr = parse_equality("5 != 10").unwrap().1;
let result = expr.evaluate(&mut context).unwrap();
assert_eq!(result, Value::Literal(Literal::Bool(true)));

// Evaluate with type promotion: 5 = "5"
let expr = parse_equality("5 = \"5\"").unwrap().1;
let result = expr.evaluate(&mut context).unwrap();
assert_eq!(result, Value::Literal(Literal::Bool(true)));
Source§

fn write(&self, writer: &mut Writer)

Write this equality expression to the provided writer.

This method serializes the expression to a text representation using the writer’s current formatting mode. The writer handles indentation, operator spacing, and other formatting concerns.

§Serialization Strategy
  • Equality Comparison (Equality::Equal):

    • Writes left operand
    • Writes " = " operator with spaces
    • Writes right operand
  • Inequality Comparison (Equality::NotEqual):

    • Writes left operand
    • Writes " != " operator with spaces
    • Writes right operand
  • Flattened Expression (Equality::Primary):

    • Delegates writing to the underlying primary expression
§Arguments
  • writer - The writer to serialize the expression to
§Examples
use aimx::expressions::equality::{Equality, parse_equality};
use aimx::{Writer, PrintMode, Prefix};

// This demonstrates the general pattern for writing equality expressions
// In practice, these would be used internally by the expression evaluator

// Writing an equality expression like "5 = 5"
// Writing an inequality expression like "5 != 10"
Source§

fn to_sanitized(&self) -> String

Convert this equality expression to a sanitized string representation.

This method produces a string with special characters escaped to make it safe for various contexts like JSON output, HTML embedding, or other contexts where escaping is required.

§Returns

A sanitized string representation of this expression.

Source§

fn to_formula(&self) -> String

Convert this equality expression to a formula string representation.

This method produces a string with proper quoting and escaping for use in formulas. The output should be round-trippable, meaning it can be parsed back into an equivalent expression.

§Returns

A formula string representation of this expression.

Source§

impl PartialEq for Equality

Source§

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

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.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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.

§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. 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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,