Line data Source code
1 : //! The names of enum node values.
2 :
3 : use dashql_buffers::parser::*;
4 :
5 : /// The name of the value of an enum node. Names are looked up by the value as an index (all these
6 : /// enums are contiguous), except for the sparse JoinType. Enums that are not listed here are named "?".
7 4464 : pub fn enum_text(node: &Node) -> &'static str {
8 4464 : let v = node.children_begin_or_value() as usize;
9 : macro_rules! by_index {
10 : ($t:ident) => {
11 4391 : $t::ENUM_VALUES.get(v).and_then(|e| e.variant_name()).unwrap_or("?")
12 : };
13 : }
14 4464 : match node.node_type() {
15 67 : NodeType::ENUM_SQL_CHARACTER_TYPE => by_index!(CharacterType),
16 127 : NodeType::ENUM_SQL_COLUMN_CONSTRAINT => by_index!(ColumnConstraint),
17 36 : NodeType::ENUM_SQL_COMBINE_MODIFIER => by_index!(CombineModifier),
18 51 : NodeType::ENUM_SQL_COMBINE_OPERATION => by_index!(CombineOperation),
19 9 : NodeType::ENUM_SQL_CONSTRAINT_ATTRIBUTE => by_index!(ConstraintAttribute),
20 0 : NodeType::ENUM_SQL_CONST_TYPE => by_index!(AConstType),
21 2947 : NodeType::ENUM_SQL_EXPRESSION_OPERATOR => by_index!(ExpressionOperator),
22 5 : NodeType::ENUM_SQL_EXTRACT_TARGET => by_index!(ExtractTarget),
23 436 : NodeType::ENUM_SQL_GROUP_BY_ITEM_TYPE => by_index!(GroupByItemType),
24 9 : NodeType::ENUM_SQL_INTERVAL_TYPE => by_index!(IntervalType),
25 0 : NodeType::ENUM_SQL_KEY_ACTION_COMMAND => by_index!(KeyActionCommand),
26 0 : NodeType::ENUM_SQL_KEY_ACTION_TRIGGER => by_index!(KeyActionTrigger),
27 1 : NodeType::ENUM_SQL_KEY_MATCH => by_index!(KeyMatch),
28 219 : NodeType::ENUM_SQL_KNOWN_FUNCTION => by_index!(KnownFunction),
29 156 : NodeType::ENUM_SQL_NUMERIC_TYPE => by_index!(NumericType),
30 4 : NodeType::ENUM_SQL_ON_COMMIT_OPTION => by_index!(OnCommitOption),
31 54 : NodeType::ENUM_SQL_ORDER_DIRECTION => by_index!(OrderDirection),
32 161 : NodeType::ENUM_SQL_ORDER_NULL_RULE => by_index!(OrderNullRule),
33 2 : NodeType::ENUM_SQL_ROW_LOCKING_BLOCK_BEHAVIOR => by_index!(RowLockingBlockBehavior),
34 8 : NodeType::ENUM_SQL_ROW_LOCKING_STRENGTH => by_index!(RowLockingStrength),
35 11 : NodeType::ENUM_SQL_SAMPLE_UNIT_TYPE => by_index!(SampleCountUnit),
36 7 : NodeType::ENUM_SQL_SUBQUERY_QUANTIFIER => by_index!(SubqueryQuantifier),
37 27 : NodeType::ENUM_SQL_TABLE_CONSTRAINT => by_index!(TableConstraint),
38 12 : NodeType::ENUM_SQL_TEMP_TYPE => by_index!(TempType),
39 6 : NodeType::ENUM_SQL_TRIM_TARGET => by_index!(TrimDirection),
40 10 : NodeType::ENUM_SQL_WINDOW_BOUND_DIRECTION => by_index!(WindowBoundDirection),
41 17 : NodeType::ENUM_SQL_WINDOW_BOUND_MODE => by_index!(WindowBoundMode),
42 0 : NodeType::ENUM_SQL_WINDOW_EXCLUSION_MODE => by_index!(WindowExclusionMode),
43 9 : NodeType::ENUM_SQL_WINDOW_RANGE_MODE => by_index!(WindowRangeMode),
44 73 : NodeType::ENUM_SQL_JOIN_TYPE => JoinType(v as u8).variant_name().filter(|_| v <= u8::MAX as usize).unwrap_or("?"),
45 0 : _ => "?",
46 : }
47 4464 : }
48 :
49 : #[cfg(test)]
50 : mod tests {
51 : use super::*;
52 : use crate::parser::actions::{enum_node, NO_PARENT};
53 :
54 : #[test]
55 1 : fn names_enum_values() {
56 1 : let loc = SymbolSpan::default();
57 1 : assert_eq!(enum_text(&enum_node(loc, ExpressionOperator::AND)), "AND");
58 1 : assert_eq!(enum_text(&enum_node(loc, JoinType::OUTER_FULL)), "OUTER_FULL");
59 1 : assert_eq!(enum_text(&enum_node(loc, KeyMatch::FULL)), "FULL");
60 1 : assert_eq!(enum_text(&enum_node(loc, TableConstraint::UNIQUE)), "UNIQUE");
61 1 : assert_eq!(enum_text(&enum_node(loc, SampleCountUnit::PERCENT)), "PERCENT");
62 1 : let _ = NO_PARENT;
63 1 : }
64 : }
|