@@ -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+ }
235246impl 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