Skip to main content

limbo_sqlite3_parser/parser/ast/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use crate::custom_err;
6use crate::parser::ParserError;
7use std::str::{self};
8
9use super::macros::JoinType;
10#[cfg(test)]
11use super::types::{Name, PragmaName};
12use super::types_10::{QuotedIterator, TableReferenceId};
13
14impl From<TableReferenceId> for usize {
15    fn from(value: TableReferenceId) -> Self {
16        value.0
17    }
18}
19
20impl TryFrom<&[u8]> for JoinType {
21    type Error = ParserError;
22    fn try_from(s: &[u8]) -> Result<Self, ParserError> {
23        if b"CROSS".eq_ignore_ascii_case(s) {
24            Ok(Self::INNER | Self::CROSS)
25        } else if b"FULL".eq_ignore_ascii_case(s) {
26            Ok(Self::LEFT | Self::RIGHT | Self::OUTER)
27        } else if b"INNER".eq_ignore_ascii_case(s) {
28            Ok(Self::INNER)
29        } else if b"LEFT".eq_ignore_ascii_case(s) {
30            Ok(Self::LEFT | Self::OUTER)
31        } else if b"NATURAL".eq_ignore_ascii_case(s) {
32            Ok(Self::NATURAL)
33        } else if b"RIGHT".eq_ignore_ascii_case(s) {
34            Ok(Self::RIGHT | Self::OUTER)
35        } else if b"OUTER".eq_ignore_ascii_case(s) {
36            Ok(Self::OUTER)
37        } else {
38            Err(custom_err!(
39                "unsupported JOIN type: {:?}",
40                str::from_utf8(s)
41            ))
42        }
43    }
44}
45
46pub(super) fn eq_ignore_case_and_quote(
47    mut it: QuotedIterator<'_>,
48    mut other: QuotedIterator<'_>,
49) -> bool {
50    loop {
51        match (it.next(), other.next()) {
52            (Some(b1), Some(b2)) => {
53                if !b1.eq_ignore_ascii_case(&b2) {
54                    return false;
55                }
56            }
57            (None, None) => break,
58            _ => return false,
59        }
60    }
61    true
62}
63
64#[cfg(test)]
65pub(super) mod test {
66    use super::{Name, PragmaName};
67    use strum::IntoEnumIterator;
68
69    #[test]
70    fn test_dequote() {
71        assert_eq!(name("x"), "x");
72        assert_eq!(name("`x`"), "x");
73        assert_eq!(name("`x``y`"), "x`y");
74        assert_eq!(name(r#""x""#), "x");
75        assert_eq!(name(r#""x""y""#), "x\"y");
76        assert_eq!(name("[x]"), "x");
77    }
78
79    #[test]
80    // pragma pragma_list expects this to be sorted. We can avoid allocations there if we keep
81    // the list sorted.
82    fn pragma_list_sorted() {
83        let pragma_strings: Vec<String> = PragmaName::iter().map(|x| x.to_string()).collect();
84        let mut pragma_strings_sorted = pragma_strings.clone();
85        pragma_strings_sorted.sort();
86        assert_eq!(pragma_strings, pragma_strings_sorted);
87    }
88
89    fn name(s: &'static str) -> Name {
90        Name(s.to_owned())
91    }
92}