sqruff_lib_core/parser/segments/
bracketed.rs

1use ahash::AHashSet;
2
3use super::base::ErasedSegment;
4use crate::dialects::syntax::{SyntaxKind, SyntaxSet};
5use crate::errors::SQLParseError;
6use crate::parser::context::ParseContext;
7use crate::parser::match_result::MatchResult;
8use crate::parser::matchable::{
9    Matchable, MatchableCacheKey, MatchableTrait, next_matchable_cache_key,
10};
11
12#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
13pub struct BracketedSegmentMatcher {
14    cache_key: MatchableCacheKey,
15}
16
17impl BracketedSegmentMatcher {
18    pub fn new() -> Self {
19        Self {
20            cache_key: next_matchable_cache_key(),
21        }
22    }
23}
24
25impl Default for BracketedSegmentMatcher {
26    fn default() -> Self {
27        Self::new()
28    }
29}
30
31impl MatchableTrait for BracketedSegmentMatcher {
32    fn elements(&self) -> &[Matchable] {
33        &[]
34    }
35
36    fn simple(
37        &self,
38        _parse_context: &ParseContext,
39        _crumbs: Option<Vec<&str>>,
40    ) -> Option<(AHashSet<String>, SyntaxSet)> {
41        None
42    }
43
44    fn match_segments(
45        &self,
46        segments: &[ErasedSegment],
47        idx: u32,
48        _parse_context: &mut ParseContext,
49    ) -> Result<MatchResult, SQLParseError> {
50        if segments[idx as usize].get_type() == SyntaxKind::Bracketed {
51            return Ok(MatchResult::from_span(idx, idx + 1));
52        }
53
54        Ok(MatchResult::empty_at(idx))
55    }
56
57    fn cache_key(&self) -> MatchableCacheKey {
58        self.cache_key
59    }
60}