Skip to main content

rs_teststand/expression/function/
string.rs

1//! String expression functions.
2
3/// A string function of the expression language.
4///
5/// Names only: what each one computes is the engine's to document.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum StringFunction {
8    /// `CheckStrLimit`.
9    CheckStrLimit,
10    /// `Chr`.
11    Chr,
12    /// `DelocalizeExpression`.
13    DelocalizeExpression,
14    /// `Find`.
15    Find,
16    /// `FindPattern`.
17    FindPattern,
18    /// `Left`.
19    Left,
20    /// `Len`.
21    Len,
22    /// `LocalizedDecimalPoint`.
23    LocalizedDecimalPoint,
24    /// `LocalizeExpression`.
25    LocalizeExpression,
26    /// `MatchPattern`.
27    MatchPattern,
28    /// `Mid`.
29    Mid,
30    /// `Replace`.
31    Replace,
32    /// `ResStr`.
33    ResStr,
34    /// `Right`.
35    Right,
36    /// `SearchAndReplace`.
37    SearchAndReplace,
38    /// `SearchPatternAndReplace`.
39    SearchPatternAndReplace,
40    /// `Split`.
41    Split,
42    /// `Str`.
43    Str,
44    /// `StrComp`.
45    StrComp,
46    /// `ToLower`.
47    ToLower,
48    /// `ToUpper`.
49    ToUpper,
50    /// `Trim`.
51    Trim,
52    /// `TrimEnd`.
53    TrimEnd,
54    /// `TrimStart`.
55    TrimStart,
56}
57
58impl StringFunction {
59    /// Every function in this family.
60    pub const ALL: [Self; 24] = [
61        Self::CheckStrLimit,
62        Self::Chr,
63        Self::DelocalizeExpression,
64        Self::Find,
65        Self::FindPattern,
66        Self::Left,
67        Self::Len,
68        Self::LocalizedDecimalPoint,
69        Self::LocalizeExpression,
70        Self::MatchPattern,
71        Self::Mid,
72        Self::Replace,
73        Self::ResStr,
74        Self::Right,
75        Self::SearchAndReplace,
76        Self::SearchPatternAndReplace,
77        Self::Split,
78        Self::Str,
79        Self::StrComp,
80        Self::ToLower,
81        Self::ToUpper,
82        Self::Trim,
83        Self::TrimEnd,
84        Self::TrimStart,
85    ];
86
87    /// The name as written in an expression.
88    #[must_use]
89    pub const fn name(self) -> &'static str {
90        match self {
91            Self::CheckStrLimit => "CheckStrLimit",
92            Self::Chr => "Chr",
93            Self::DelocalizeExpression => "DelocalizeExpression",
94            Self::Find => "Find",
95            Self::FindPattern => "FindPattern",
96            Self::Left => "Left",
97            Self::Len => "Len",
98            Self::LocalizedDecimalPoint => "LocalizedDecimalPoint",
99            Self::LocalizeExpression => "LocalizeExpression",
100            Self::MatchPattern => "MatchPattern",
101            Self::Mid => "Mid",
102            Self::Replace => "Replace",
103            Self::ResStr => "ResStr",
104            Self::Right => "Right",
105            Self::SearchAndReplace => "SearchAndReplace",
106            Self::SearchPatternAndReplace => "SearchPatternAndReplace",
107            Self::Split => "Split",
108            Self::Str => "Str",
109            Self::StrComp => "StrComp",
110            Self::ToLower => "ToLower",
111            Self::ToUpper => "ToUpper",
112            Self::Trim => "Trim",
113            Self::TrimEnd => "TrimEnd",
114            Self::TrimStart => "TrimStart",
115        }
116    }
117}
118
119#[cfg(test)]
120mod tests {
121    use super::StringFunction;
122
123    #[test]
124    fn every_name_is_distinct() {
125        let mut names: Vec<&str> = StringFunction::ALL.iter().map(|f| f.name()).collect();
126        names.sort_unstable();
127        let count = names.len();
128        names.dedup();
129        assert_eq!(names.len(), count);
130    }
131}