use crate::catalog::{arithmetic::ArithmeticPos, atom::AtomArgumentSignature};
use crate::parser::{ComparisonExpr, ComparisonOperator};
use std::fmt;
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub(crate) struct ComparisonExprPos {
left: ArithmeticPos,
operator: ComparisonOperator,
right: ArithmeticPos,
}
impl ComparisonExprPos {
pub(crate) fn from_comparison_expr(
compare_expr: &ComparisonExpr,
left_var_signatures: &[AtomArgumentSignature],
right_var_signatures: &[AtomArgumentSignature],
) -> Self {
let left = ArithmeticPos::from_arithmetic(compare_expr.left(), left_var_signatures);
let right = ArithmeticPos::from_arithmetic(compare_expr.right(), right_var_signatures);
let operator = compare_expr.operator().clone();
Self {
left,
operator,
right,
}
}
pub(crate) fn from_parts(
left: ArithmeticPos,
operator: ComparisonOperator,
right: ArithmeticPos,
) -> Self {
Self {
left,
operator,
right,
}
}
#[inline]
pub(crate) fn operator(&self) -> &ComparisonOperator {
&self.operator
}
#[inline]
pub(crate) fn left(&self) -> &ArithmeticPos {
&self.left
}
#[inline]
pub(crate) fn right(&self) -> &ArithmeticPos {
&self.right
}
}
impl fmt::Display for ComparisonExprPos {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "[{} {} {}]", self.left, self.operator, self.right)
}
}