Skip to content

Commit afaaf4c

Browse files
committed
Simplify parsing code
1 parent 3b7cf23 commit afaaf4c

File tree

1 file changed

+22
-33
lines changed

1 file changed

+22
-33
lines changed

sqlsonnet/src/from_sql.rs

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,26 @@ impl FromParsed for queries::join::Join {
232232
})
233233
}
234234
}
235+
fn parse_first_tagged<T: std::str::FromStr>(p: Pair<Rule>, tag: &str) -> T
236+
where
237+
T::Err: std::fmt::Debug,
238+
{
239+
p.into_inner()
240+
.find_first_tagged(tag)
241+
.unwrap()
242+
.as_str()
243+
.parse()
244+
.unwrap()
245+
}
235246
impl FromParsed for queries::select::Query {
236247
fn parse(parsed: Pair<Rule>) -> Result<Self, SQLParseError> {
237248
assert_eq!(parsed.as_rule(), Rule::select);
238249
let mut query = queries::select::Query::default();
239250
for p in parsed.into_inner() {
240251
let rule = p.as_rule();
252+
fn parse_inner<T: FromParsed>(p: Pair<Rule>) -> Result<T, SQLParseError> {
253+
FromParsed::parse(p.into_inner().nth(1).unwrap())
254+
}
241255
match rule {
242256
Rule::fields => {
243257
query.fields = Some(FromParsed::parse(p.into_inner().next().unwrap())?);
@@ -246,52 +260,27 @@ impl FromParsed for queries::select::Query {
246260
query.from = Some(FromParsed::parse(p)?);
247261
}
248262
Rule::limit => {
249-
query.limit = Some(
250-
p.into_inner()
251-
.find_first_tagged("limit")
252-
.unwrap()
253-
.as_str()
254-
.parse()
255-
.unwrap(),
256-
);
257-
}
258-
Rule::sample => {
259-
query.sample = Some(
260-
p.into_inner()
261-
.find_first_tagged("sample")
262-
.unwrap()
263-
.as_str()
264-
.parse()
265-
.unwrap(),
266-
)
267-
}
268-
Rule::offset => {
269-
query.offset = Some(
270-
p.into_inner()
271-
.find_first_tagged("offset")
272-
.unwrap()
273-
.as_str()
274-
.parse()
275-
.unwrap(),
276-
)
263+
query.limit = Some(parse_first_tagged(p, "limit"));
277264
}
265+
Rule::sample => query.sample = Some(parse_first_tagged(p, "sample")),
266+
Rule::offset => query.offset = Some(parse_first_tagged(p, "offset")),
278267
Rule::order_by => {
279-
query.order_by = FromParsed::parse(p.into_inner().nth(1).unwrap())?;
268+
query.order_by = parse_inner(p)?;
280269
}
281270
Rule::group_by => {
282-
query.group_by = FromParsed::parse(p.into_inner().nth(1).unwrap())?;
271+
query.group_by = parse_inner(p)?;
283272
}
284273
Rule::join => {
285274
query.joins.push(FromParsed::parse(p)?);
286275
}
287276
Rule::r#where => {
288-
query.where_ = Some(FromParsed::parse(p.into_inner().nth(1).unwrap())?);
277+
query.where_ = Some(parse_inner(p)?);
289278
}
290279
Rule::having => {
291-
query.having = Some(FromParsed::parse(p.into_inner().nth(1).unwrap())?);
280+
query.having = Some(parse_inner(p)?);
292281
}
293282
Rule::settings => {
294-
query.settings = FromParsed::parse(p.into_inner().nth(1).unwrap())?;
283+
query.settings = parse_inner(p)?;
295284
}
296285
_ => {}
297286
}

0 commit comments

Comments
 (0)