vegafusion_core/expression/ast/
call.rs

1use crate::expression::ast::expression::ExpressionTrait;
2use crate::proto::gen::expression::{CallExpression, Expression};
3use std::fmt::{Display, Formatter};
4
5impl CallExpression {
6    pub fn new(callee: &str, arguments: Vec<Expression>) -> Self {
7        Self {
8            callee: callee.to_string(),
9            arguments,
10        }
11    }
12}
13
14impl ExpressionTrait for CallExpression {}
15
16impl Display for CallExpression {
17    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
18        let internal_binding_power = 1.0;
19        let mut arg_strings: Vec<String> = Vec::new();
20        for arg in self.arguments.iter() {
21            let arg_binding_power = arg.binding_power().0;
22            let arg_string = if arg_binding_power > internal_binding_power {
23                format!("{arg}")
24            } else {
25                // e.g. the argument is a comma infix operation, so it must be wrapped in parens
26                format!("({arg})")
27            };
28            arg_strings.push(arg_string)
29        }
30        let args_string = arg_strings.join(", ");
31
32        write!(f, "{}({})", self.callee, args_string)
33    }
34}