1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
use strum_macros::{Display, EnumIter, EnumString, IntoStaticStr};

#[derive(Debug, PartialEq)]
pub(crate) enum Arity {
    Single,
    Closure,
    Dual,
}

#[derive(Debug, PartialEq, Eq, Clone, Copy, EnumString, Display, IntoStaticStr, EnumIter)]
#[strum(serialize_all = "camelCase")]
pub enum BuiltInFunction {
    // General
    Len,
    Contains,
    Flatten,

    // String
    Upper,
    Lower,
    StartsWith,
    EndsWith,
    Matches,
    Extract,
    FuzzyMatch,
    Split,

    // Math
    Abs,
    Sum,
    Avg,
    Min,
    Max,
    Rand,
    Median,
    Mode,
    Floor,
    Ceil,
    Round,

    // Type
    IsNumeric,
    String,
    Number,
    Bool,
    Type,

    // Date + time
    Date,
    Time,
    Duration,
    Year,
    DayOfWeek,
    DayOfMonth,
    DayOfYear,
    WeekOfYear,
    MonthOfYear,
    MonthString,
    DateString,
    WeekdayString,
    StartOf,
    EndOf,

    // Map
    Keys,
    Values,

    // Closures
    All,
    Some,
    None,
    Filter,
    Map,
    Count,
    One,
    FlatMap,
}

impl BuiltInFunction {
    pub(crate) fn arity(&self) -> Arity {
        match &self {
            // General
            BuiltInFunction::Len => Arity::Single,
            BuiltInFunction::Contains => Arity::Dual,
            BuiltInFunction::Flatten => Arity::Single,

            // String
            BuiltInFunction::Upper => Arity::Single,
            BuiltInFunction::Lower => Arity::Single,
            BuiltInFunction::StartsWith => Arity::Dual,
            BuiltInFunction::EndsWith => Arity::Dual,
            BuiltInFunction::Matches => Arity::Dual,
            BuiltInFunction::Extract => Arity::Dual,
            BuiltInFunction::FuzzyMatch => Arity::Dual,
            BuiltInFunction::Split => Arity::Dual,

            // Math
            BuiltInFunction::Abs => Arity::Single,
            BuiltInFunction::Sum => Arity::Single,
            BuiltInFunction::Avg => Arity::Single,
            BuiltInFunction::Min => Arity::Single,
            BuiltInFunction::Max => Arity::Single,
            BuiltInFunction::Rand => Arity::Single,
            BuiltInFunction::Median => Arity::Single,
            BuiltInFunction::Mode => Arity::Single,
            BuiltInFunction::Floor => Arity::Single,
            BuiltInFunction::Ceil => Arity::Single,
            BuiltInFunction::Round => Arity::Single,

            // Date + time
            BuiltInFunction::Date => Arity::Single,
            BuiltInFunction::Time => Arity::Single,
            BuiltInFunction::Duration => Arity::Single,
            BuiltInFunction::Year => Arity::Single,
            BuiltInFunction::DayOfWeek => Arity::Single,
            BuiltInFunction::DayOfMonth => Arity::Single,
            BuiltInFunction::DayOfYear => Arity::Single,
            BuiltInFunction::WeekOfYear => Arity::Single,
            BuiltInFunction::MonthOfYear => Arity::Single,
            BuiltInFunction::MonthString => Arity::Single,
            BuiltInFunction::DateString => Arity::Single,
            BuiltInFunction::WeekdayString => Arity::Single,
            BuiltInFunction::StartOf => Arity::Dual,
            BuiltInFunction::EndOf => Arity::Dual,

            // Type
            BuiltInFunction::String => Arity::Single,
            BuiltInFunction::Number => Arity::Single,
            BuiltInFunction::Bool => Arity::Single,
            BuiltInFunction::IsNumeric => Arity::Single,
            BuiltInFunction::Type => Arity::Single,

            // Map
            BuiltInFunction::Keys => Arity::Single,
            BuiltInFunction::Values => Arity::Single,

            // Closure
            BuiltInFunction::All => Arity::Closure,
            BuiltInFunction::Some => Arity::Closure,
            BuiltInFunction::None => Arity::Closure,
            BuiltInFunction::Filter => Arity::Closure,
            BuiltInFunction::Map => Arity::Closure,
            BuiltInFunction::Count => Arity::Closure,
            BuiltInFunction::One => Arity::Closure,
            BuiltInFunction::FlatMap => Arity::Closure,
        }
    }
}