surql_parser/upstream/syn/parser/
kind.rs1use super::mac::unexpected;
2use super::{ParseResult, Parser};
3use crate::compat::types::PublicDuration;
4use crate::upstream::sql::Kind;
5use crate::upstream::sql::kind::{GeometryKind, KindLiteral};
6use crate::upstream::syn::lexer::compound;
7use crate::upstream::syn::parser::mac::expected;
8use crate::upstream::syn::token::{Keyword, Span, TokenKind, t};
9use reblessive::Stk;
10use std::collections::BTreeMap;
11impl Parser<'_> {
12 pub async fn parse_kind(&mut self, stk: &mut Stk, delim: Span) -> ParseResult<Kind> {
17 let kind = self.parse_inner_kind(stk).await?;
18 self.expect_closing_delimiter(t!(">"), delim)?;
19 Ok(kind)
20 }
21 pub async fn parse_inner_kind(&mut self, stk: &mut Stk) -> ParseResult<Kind> {
23 match self.parse_inner_single_kind(stk).await? {
24 Kind::Any => Ok(Kind::Any),
25 first => {
26 if self.peek_kind() == t!("|") {
27 let mut kind = vec![first];
28 while self.eat(t!("|")) {
29 kind.push(stk.run(|ctx| self.parse_concrete_kind(ctx)).await?);
30 }
31 let kind = Kind::either(kind);
32 Ok(kind)
33 } else {
34 Ok(first)
35 }
36 }
37 }
38 }
39 pub(super) async fn parse_inner_single_kind(&mut self, stk: &mut Stk) -> ParseResult<Kind> {
41 match self.peek_kind() {
42 t!("ANY") => {
43 self.pop_peek();
44 Ok(Kind::Any)
45 }
46 t!("OPTION") => {
47 self.pop_peek();
48 let delim = expected!(self, t!("<")).span;
49 let mut kinds = vec![
50 Kind::None,
51 stk.run(|ctx| self.parse_concrete_kind(ctx)).await?,
52 ];
53 if self.peek_kind() == t!("|") {
54 while self.eat(t!("|")) {
55 kinds.push(stk.run(|ctx| self.parse_concrete_kind(ctx)).await?);
56 }
57 }
58 self.expect_closing_delimiter(t!(">"), delim)?;
59 Ok(Kind::either(kinds))
60 }
61 _ => stk.run(|ctx| self.parse_concrete_kind(ctx)).await,
62 }
63 }
64 async fn parse_concrete_kind(&mut self, stk: &mut Stk) -> ParseResult<Kind> {
66 let next = self.next();
67 match next.kind {
68 t!("true") => Ok(Kind::Literal(KindLiteral::Bool(true))),
69 t!("false") => Ok(Kind::Literal(KindLiteral::Bool(false))),
70 t!("'") | t!("\"") => {
71 let str = self.unescape_string_span(next.span)?;
72 Ok(Kind::Literal(KindLiteral::String(str.to_owned())))
73 }
74 TokenKind::NaN => Ok(Kind::Literal(KindLiteral::Float(f64::NAN))),
75 TokenKind::Infinity => Ok(Kind::Literal(KindLiteral::Float(f64::INFINITY))),
76 t!("+") | t!("-") => {
77 let compound = self.lex_compound(next, compound::number)?;
78 let kind = match compound.value {
79 compound::Numeric::Float(f) => KindLiteral::Float(f),
80 compound::Numeric::Integer(int) => {
81 KindLiteral::Integer(int.into_int(compound.span)?)
82 }
83 compound::Numeric::Decimal(decimal) => KindLiteral::Decimal(decimal),
84 compound::Numeric::Duration(_) => unreachable!(),
85 };
86 Ok(Kind::Literal(kind))
87 }
88 TokenKind::Digits => {
89 let compound = self.lex_compound(next, compound::numeric)?;
90 let v = match compound.value {
91 compound::Numeric::Integer(x) => {
92 KindLiteral::Integer(x.into_int(compound.span)?)
93 }
94 compound::Numeric::Float(x) => KindLiteral::Float(x),
95 compound::Numeric::Decimal(x) => KindLiteral::Decimal(x),
96 compound::Numeric::Duration(x) => {
97 KindLiteral::Duration(PublicDuration::from_std(x))
98 }
99 };
100 Ok(Kind::Literal(v))
101 }
102 t!("{") => {
103 let mut obj = BTreeMap::new();
104 while !self.eat(t!("}")) {
105 let key = self.parse_object_key()?;
106 expected!(self, t!(":"));
107 let kind = stk.run(|ctx| self.parse_inner_kind(ctx)).await?;
108 obj.insert(key, kind);
109 self.eat(t!(","));
110 }
111 Ok(Kind::Literal(KindLiteral::Object(obj)))
112 }
113 t!("[") => {
114 let mut arr = Vec::new();
115 while !self.eat(t!("]")) {
116 let kind = stk.run(|ctx| self.parse_inner_kind(ctx)).await?;
117 arr.push(kind);
118 self.eat(t!(","));
119 }
120 Ok(Kind::Literal(KindLiteral::Array(arr)))
121 }
122 t!("BOOL") => Ok(Kind::Bool),
123 t!("NONE") => Ok(Kind::None),
124 t!("NULL") => Ok(Kind::Null),
125 t!("BYTES") => Ok(Kind::Bytes),
126 t!("DATETIME") => Ok(Kind::Datetime),
127 t!("DECIMAL") => Ok(Kind::Decimal),
128 t!("DURATION") => Ok(Kind::Duration),
129 t!("FLOAT") => Ok(Kind::Float),
130 t!("INT") => Ok(Kind::Int),
131 t!("NUMBER") => Ok(Kind::Number),
132 t!("OBJECT") => Ok(Kind::Object),
133 t!("POINT") => Ok(Kind::Geometry(vec![GeometryKind::Point])),
134 t!("STRING") => Ok(Kind::String),
135 t!("UUID") => Ok(Kind::Uuid),
136 t!("RANGE") => Ok(Kind::Range),
137 t!("REGEX") => Ok(Kind::Regex),
138 t!("FUNCTION") => Ok(Kind::Function(Default::default(), Default::default())),
139 t!("RECORD") => {
140 let span = self.peek().span;
141 if self.eat(t!("<")) {
142 let mut tables = vec![self.parse_ident()?];
143 while self.eat(t!("|")) {
144 tables.push(self.parse_ident()?);
145 }
146 self.expect_closing_delimiter(t!(">"), span)?;
147 Ok(Kind::Record(tables))
148 } else {
149 Ok(Kind::Record(Vec::new()))
150 }
151 }
152 t!("TABLE") => {
153 let span = self.peek().span;
154 if self.eat(t!("<")) {
155 let mut tables = vec![self.parse_ident()?];
156 while self.eat(t!("|")) {
157 tables.push(self.parse_ident()?);
158 }
159 self.expect_closing_delimiter(t!(">"), span)?;
160 Ok(Kind::Table(tables))
161 } else {
162 Ok(Kind::Table(Vec::new()))
163 }
164 }
165 t!("GEOMETRY") => {
166 let span = self.peek().span;
167 if self.eat(t!("<")) {
168 let mut kind = vec![self.parse_geometry_kind()?];
169 while self.eat(t!("|")) {
170 kind.push(self.parse_geometry_kind()?);
171 }
172 self.expect_closing_delimiter(t!(">"), span)?;
173 Ok(Kind::Geometry(kind))
174 } else {
175 Ok(Kind::Geometry(Vec::new()))
176 }
177 }
178 t!("ARRAY") => {
179 let span = self.peek().span;
180 if self.eat(t!("<")) {
181 let kind = stk.run(|ctx| self.parse_inner_kind(ctx)).await?;
182 let size = self
183 .eat(t!(","))
184 .then(|| self.next_token_value())
185 .transpose()?;
186 self.expect_closing_delimiter(t!(">"), span)?;
187 Ok(Kind::Array(Box::new(kind), size))
188 } else {
189 Ok(Kind::Array(Box::new(Kind::Any), None))
190 }
191 }
192 t!("SET") => {
193 let span = self.peek().span;
194 if self.eat(t!("<")) {
195 let kind = stk.run(|ctx| self.parse_inner_kind(ctx)).await?;
196 let size = self
197 .eat(t!(","))
198 .then(|| self.next_token_value())
199 .transpose()?;
200 self.expect_closing_delimiter(t!(">"), span)?;
201 Ok(Kind::Set(Box::new(kind), size))
202 } else {
203 Ok(Kind::Set(Box::new(Kind::Any), None))
204 }
205 }
206 t!("FILE") => {
207 let span = self.peek().span;
208 if self.eat(t!("<")) {
209 let mut buckets = vec![self.parse_ident()?];
210 while self.eat(t!("|")) {
211 buckets.push(self.parse_ident()?);
212 }
213 self.expect_closing_delimiter(t!(">"), span)?;
214 Ok(Kind::File(buckets))
215 } else {
216 Ok(Kind::File(Vec::new()))
217 }
218 }
219 _ => unexpected!(self, next, "a kind name"),
220 }
221 }
222 fn parse_geometry_kind(&mut self) -> ParseResult<GeometryKind> {
224 let next = self.next();
225 match next.kind {
226 TokenKind::Keyword(keyword) => match keyword {
227 Keyword::Point => Ok(GeometryKind::Point),
228 Keyword::Line => Ok(GeometryKind::Line),
229 Keyword::Polygon => Ok(GeometryKind::Polygon),
230 Keyword::MultiPoint => Ok(GeometryKind::MultiPoint),
231 Keyword::MultiLine => Ok(GeometryKind::MultiLine),
232 Keyword::MultiPolygon => Ok(GeometryKind::MultiPolygon),
233 Keyword::Collection => Ok(GeometryKind::Collection),
234 _ => unexpected!(self, next, "a geometry kind name"),
235 },
236 _ => unexpected!(self, next, "a geometry kind name"),
237 }
238 }
239}