use std::fmt;
use super::function::Function;
use super::group::Group;
use super::operator::Operator;
use super::return_value::{LabelSetOp, ReturnKind, ReturnValue};
use super::selector::Selector;
#[derive(PartialEq, Clone)]
pub enum Expression {
Float(f64),
String(String),
Selector(Selector),
Group(Group),
Function(Function),
Operator(Operator)
}
impl Expression {
pub fn group(self) -> Expression {
Group::new(self).wrap()
}
pub fn return_value(&self) -> ReturnValue {
match self {
Expression::Float(_) => ReturnValue {
kind: ReturnKind::Scalar,
label_ops: vec![LabelSetOp::clear(self.clone(), None)]
},
Expression::String(_) => ReturnValue {
kind: ReturnKind::String,
label_ops: vec![LabelSetOp::clear(self.clone(), None)]
},
Expression::Selector(s) => s.return_value(),
Expression::Group(g) => g.return_value(),
Expression::Function(f) => f.return_value(),
Expression::Operator(o) => o.return_value()
}
}
pub fn as_f64(&self) -> Option<f64> {
if let Expression::Float(f) = self {
Some(*f)
} else {
None
}
}
pub fn as_str(&self) -> Option<&str> {
if let Expression::String(s) = self {
Some(s.as_str())
} else {
None
}
}
}
impl fmt::Debug for Expression {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if f.alternate() {
match self {
Expression::Float(val) => write!(f, "{:#?}", val),
Expression::String(val) => write!(f, "{:#?}", val),
Expression::Selector(val) => write!(f, "{:#?}", val),
Expression::Group(val) => write!(f, "{:#?}", val),
Expression::Function(val) => write!(f, "{:#?}", val),
Expression::Operator(val) => write!(f, "{:#?}", val),
}
} else {
match self {
Expression::Float(val) => write!(f, "{:?}", val),
Expression::String(val) => write!(f, "{:?}", val),
Expression::Selector(val) => write!(f, "{:?}", val),
Expression::Group(val) => write!(f, "{:?}", val),
Expression::Function(val) => write!(f, "{:?}", val),
Expression::Operator(val) => write!(f, "{:?}", val),
}
}
}
}
impl fmt::Display for Expression {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Expression::Float(val) => write!(f, "{}", val),
Expression::String(val) => write!(f, "{}", val),
Expression::Selector(val) => write!(f, "{}", val),
Expression::Group(val) => write!(f, "{}", val),
Expression::Function(val) => write!(f, "{}", val),
Expression::Operator(val) => write!(f, "{}", val),
}
}
}
pub type BExpression = Box<Expression>;