use crate::typ::Type;
use crate::value::Value;
#[derive(Debug, Clone)]
pub enum Expr {
Literal(Value),
Call { op: String, args: Vec<Expr> },
Let {
bindings: Vec<(String, Expr)>,
body: Box<Expr>,
},
Var(String),
Match {
input: Box<Expr>,
arms: Vec<(Vec<Value>, Expr)>,
default: Box<Expr>,
},
Step {
input: Box<Expr>,
output0: Box<Expr>,
stops: Vec<(f64, Expr)>,
},
Interpolate {
kind: InterpKind,
space: InterpSpace,
input: Box<Expr>,
stops: Vec<(f64, Expr)>,
projection: bool,
},
Format(Vec<FormatArg>),
Within(Vec<Vec<Vec<(f64, f64)>>>),
Distance(Vec<crate::distance::SimpleGeom>),
Collator {
case_sensitive: Option<Box<Expr>>,
diacritic_sensitive: Option<Box<Expr>>,
locale: Option<Box<Expr>>,
},
NumberFormat {
value: Box<Expr>,
locale: Option<Box<Expr>>,
currency: Option<Box<Expr>>,
min_fraction_digits: Option<Box<Expr>>,
max_fraction_digits: Option<Box<Expr>>,
unit: Option<Box<Expr>>,
},
Assert(Type, Box<Expr>),
Coerce(Type, Box<Expr>),
}
#[derive(Debug, Clone)]
pub struct FormatArg {
pub content: Expr,
pub scale: Option<Expr>,
pub font: Option<Expr>,
pub text_color: Option<Expr>,
pub vertical_align: Option<Expr>,
}
#[derive(Debug, Clone, Copy)]
pub enum InterpKind {
Linear,
Exponential(f64),
CubicBezier(f64, f64, f64, f64),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum InterpSpace {
Rgb,
Hcl,
Lab,
}