LCOV - code coverage report
Current view: top level - dashql-parser/src/parser - enums.rs Coverage Total Hit
Test: DashQL 915828b Lines: 88.9 % 45 40
Test Date: 2026-11-06 19:30:32

            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              : }
        

Generated by: LCOV version 2.0-1