zen_expression/parser/
builtin.rs

1use strum_macros::{Display, EnumIter, EnumString, IntoStaticStr};
2
3#[derive(Debug, PartialEq)]
4pub(crate) enum Arity {
5    Single,
6    Closure,
7    Dual,
8}
9
10#[derive(Debug, PartialEq, Eq, Clone, Copy, EnumString, Display, IntoStaticStr, EnumIter)]
11#[strum(serialize_all = "camelCase")]
12pub enum BuiltInFunction {
13    // General
14    Len,
15    Contains,
16    Flatten,
17
18    // String
19    Upper,
20    Lower,
21    Trim,
22    StartsWith,
23    EndsWith,
24    Matches,
25    Extract,
26    FuzzyMatch,
27    Split,
28
29    // Math
30    Abs,
31    Sum,
32    Avg,
33    Min,
34    Max,
35    Rand,
36    Median,
37    Mode,
38    Floor,
39    Ceil,
40    Round,
41
42    // Type
43    IsNumeric,
44    String,
45    Number,
46    Bool,
47    Type,
48
49    // Date + time
50    Date,
51    Time,
52    Duration,
53    Year,
54    DayOfWeek,
55    DayOfMonth,
56    DayOfYear,
57    WeekOfYear,
58    MonthOfYear,
59    MonthString,
60    DateString,
61    WeekdayString,
62    StartOf,
63    EndOf,
64
65    // Map
66    Keys,
67    Values,
68
69    // Closures
70    All,
71    Some,
72    None,
73    Filter,
74    Map,
75    Count,
76    One,
77    FlatMap,
78}
79
80impl BuiltInFunction {
81    pub(crate) fn arity(&self) -> Arity {
82        match &self {
83            // General
84            BuiltInFunction::Len => Arity::Single,
85            BuiltInFunction::Contains => Arity::Dual,
86            BuiltInFunction::Flatten => Arity::Single,
87
88            // String
89            BuiltInFunction::Upper => Arity::Single,
90            BuiltInFunction::Lower => Arity::Single,
91            BuiltInFunction::Trim => Arity::Single,
92            BuiltInFunction::StartsWith => Arity::Dual,
93            BuiltInFunction::EndsWith => Arity::Dual,
94            BuiltInFunction::Matches => Arity::Dual,
95            BuiltInFunction::Extract => Arity::Dual,
96            BuiltInFunction::FuzzyMatch => Arity::Dual,
97            BuiltInFunction::Split => Arity::Dual,
98
99            // Math
100            BuiltInFunction::Abs => Arity::Single,
101            BuiltInFunction::Sum => Arity::Single,
102            BuiltInFunction::Avg => Arity::Single,
103            BuiltInFunction::Min => Arity::Single,
104            BuiltInFunction::Max => Arity::Single,
105            BuiltInFunction::Rand => Arity::Single,
106            BuiltInFunction::Median => Arity::Single,
107            BuiltInFunction::Mode => Arity::Single,
108            BuiltInFunction::Floor => Arity::Single,
109            BuiltInFunction::Ceil => Arity::Single,
110            BuiltInFunction::Round => Arity::Single,
111
112            // Date + time
113            BuiltInFunction::Date => Arity::Single,
114            BuiltInFunction::Time => Arity::Single,
115            BuiltInFunction::Duration => Arity::Single,
116            BuiltInFunction::Year => Arity::Single,
117            BuiltInFunction::DayOfWeek => Arity::Single,
118            BuiltInFunction::DayOfMonth => Arity::Single,
119            BuiltInFunction::DayOfYear => Arity::Single,
120            BuiltInFunction::WeekOfYear => Arity::Single,
121            BuiltInFunction::MonthOfYear => Arity::Single,
122            BuiltInFunction::MonthString => Arity::Single,
123            BuiltInFunction::DateString => Arity::Single,
124            BuiltInFunction::WeekdayString => Arity::Single,
125            BuiltInFunction::StartOf => Arity::Dual,
126            BuiltInFunction::EndOf => Arity::Dual,
127
128            // Type
129            BuiltInFunction::String => Arity::Single,
130            BuiltInFunction::Number => Arity::Single,
131            BuiltInFunction::Bool => Arity::Single,
132            BuiltInFunction::IsNumeric => Arity::Single,
133            BuiltInFunction::Type => Arity::Single,
134
135            // Map
136            BuiltInFunction::Keys => Arity::Single,
137            BuiltInFunction::Values => Arity::Single,
138
139            // Closure
140            BuiltInFunction::All => Arity::Closure,
141            BuiltInFunction::Some => Arity::Closure,
142            BuiltInFunction::None => Arity::Closure,
143            BuiltInFunction::Filter => Arity::Closure,
144            BuiltInFunction::Map => Arity::Closure,
145            BuiltInFunction::Count => Arity::Closure,
146            BuiltInFunction::One => Arity::Closure,
147            BuiltInFunction::FlatMap => Arity::Closure,
148        }
149    }
150}