From 21067e6211f1840a3075d9a6912459bcef22c3d0 Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Fri, 24 Dec 2021 11:00:22 +0800 Subject: [PATCH] feat(parser): add simple map func code --- quake_core/src/parser/quake.pest | 24 +++++++++++++++++++++--- quake_core/src/parser/quake_parser.rs | 19 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/quake_core/src/parser/quake.pest b/quake_core/src/parser/quake.pest index ea6d60dc..cebb6d3b 100644 --- a/quake_core/src/parser/quake.pest +++ b/quake_core/src/parser/quake.pest @@ -17,19 +17,35 @@ transflow_expr = { } midway = { - from ~ (rest_request | entry_list) ~ "." ~ to ~ l_bracket ~ parameter ~ r_bracket ~ filter_expr? + from ~ (rest_request | entry_list) ~ "." ~ to ~ l_bracket ~ parameter ~ r_bracket ~ filter_expr? ~ map_decl? } endway = { - from ~ (rest_request | entry_list) ~ "." ~ to ~ l_bracket ~ component_decl ~ r_bracket ~ filter_expr? + from ~ (rest_request | entry_list) ~ "." ~ to ~ l_bracket ~ component_decl ~ r_bracket ~ filter_expr? ~ map_decl? } filter_expr = { "." ~ filter_str ~ l_bracket ~ string ~ r_bracket } - filter_str = { "filter" | "FILTER" } +map_decl = { + "." ~ map_str ~ l_bracket ~ quoted ~ (map_expr ~ ("," ~ map_expr)*)? ~ quoted ~ r_bracket +} + +map_expr = { + ident? ~ ("." ~ ident)* ~ "=>" ~ target ~ pipe_expr* +} + +pipe_expr = { + "|" ~ pipe_func +} + +pipe_func = { ident ~ parameters? } + +target = { ident } +map_str = { "map" } + component_decl = { "<" ~ component_name ~ ">" } @@ -105,6 +121,8 @@ string = @{ single_quoted_string } +quoted = { "\"" | "\'" } + double_quoted_string = @{ "\"" ~ (!("\"") ~ ANY)* ~ "\""} single_quoted_string = @{ "\'" ~ (!("\'") ~ ANY)* ~ "\'"} diff --git a/quake_core/src/parser/quake_parser.rs b/quake_core/src/parser/quake_parser.rs index cab8c126..7de12033 100644 --- a/quake_core/src/parser/quake_parser.rs +++ b/quake_core/src/parser/quake_parser.rs @@ -399,6 +399,25 @@ mod tests { } } + #[test] + fn should_parse_flow_map() { + let _unit = parse( + "transflow show_calendar { + from('todo','blog') + .to() + .map('blog.created_date => date | date '); }", + ) + .unwrap(); + + let _unit = parse( + "transflow show_calendar { + from('todo','blog') + .to() + .map('blog.content => content | uppercase | substring(1, 150) '); }", + ) + .unwrap(); + } + #[test] fn should_parse_simple_layout() { let unit = parse(