use std::fmt::{Debug, Display};
use vantage_core::util::IntoVec;
use vantage_expressions::{Expression, Expressive, ExpressiveEnum};
#[derive(Debug, Clone)]
pub struct Fx<T: Debug + Display + Clone> {
name: String,
args: Vec<Expression<T>>,
}
impl<T: Debug + Display + Clone> Fx<T> {
pub fn new(name: impl Into<String>, args: impl IntoVec<Expression<T>>) -> Self {
Self {
name: name.into().to_uppercase(),
args: args.into_vec(),
}
}
}
impl<T: Debug + Display + Clone> Expressive<T> for Fx<T> {
fn expr(&self) -> Expression<T> {
let args_expr = Expression::from_vec(self.args.clone(), ", ");
Expression::new(
format!("{}({{}})", self.name),
vec![ExpressiveEnum::Nested(args_expr)],
)
}
}
impl<T: Debug + Display + Clone> From<Fx<T>> for Expression<T> {
fn from(fx: Fx<T>) -> Self {
fx.expr()
}
}
#[macro_export]
macro_rules! fx {
($name:expr, $($arg:expr),+ $(,)?) => {
$crate::primitives::fx::Fx::new($name, vec![
$({
#[allow(unused_imports)]
use vantage_expressions::Expressive;
($arg).expr()
}),+
])
};
}