@@ -68,6 +68,7 @@ impl Parser {
6868 Some ( Token :: ToolCall ) => self . parse_tool_call_statement ( ) ,
6969 Some ( Token :: Call ) => self . parse_call_statement ( ) ,
7070 Some ( Token :: Print ) => self . parse_print_statement ( ) ,
71+ Some ( Token :: Output ) => self . parse_output_statement ( ) ,
7172 Some ( Token :: Identifier ( _) ) => {
7273
7374 let start_pos = self . current ;
@@ -254,7 +255,7 @@ impl Parser {
254255 fn parse_use_statement ( & mut self ) -> Result < Statement , ParseError > {
255256 self . consume ( Token :: Use ) ?;
256257 self . skip_whitespace ( ) ;
257- let name = self . consume_identifier ( ) ?;
258+ let _name = self . consume_identifier ( ) ?;
258259 self . skip_whitespace ( ) ;
259260 self . consume_semicolon_optional ( ) ;
260261
@@ -351,6 +352,53 @@ impl Parser {
351352 Ok ( Statement :: PrintStatement { expression } )
352353 }
353354
355+ fn parse_output_statement ( & mut self ) -> Result < Statement , ParseError > {
356+ self . consume ( Token :: Output ) ?;
357+ self . skip_whitespace ( ) ;
358+ self . consume ( Token :: LeftBrace ) ?;
359+ self . skip_whitespace ( ) ;
360+ let mut properties = HashMap :: new ( ) ;
361+ while !self . check ( Token :: RightBrace ) {
362+ let key = self . consume_identifier ( ) ?;
363+ self . skip_whitespace ( ) ;
364+ self . consume ( Token :: Colon ) ?;
365+ self . skip_whitespace ( ) ;
366+ let value = if let Some ( Token :: Identifier ( _) ) = self . peek ( ) {
367+ let start_pos = self . current ;
368+ let type_name = self . consume_identifier ( ) ?;
369+ let is_array = self . match_token ( Token :: LeftBracket ) ;
370+ if is_array {
371+ self . consume ( Token :: RightBracket ) ?;
372+ if self . check ( Token :: LeftParen ) || self . check ( Token :: Dot ) || self . check ( Token :: LeftBracket ) {
373+ self . current = start_pos;
374+ self . parse_expression ( ) ?
375+ } else {
376+ Expression :: Literal ( Literal :: String ( format ! ( "{}[]" , type_name) ) )
377+ }
378+ } else {
379+ if self . check ( Token :: LeftParen ) || self . check ( Token :: Dot ) || self . check ( Token :: LeftBracket ) {
380+ self . current = start_pos;
381+ self . parse_expression ( ) ?
382+ } else {
383+ Expression :: Literal ( Literal :: String ( type_name) )
384+ }
385+ }
386+ } else {
387+ self . parse_expression ( ) ?
388+ } ;
389+ properties. insert ( key, value) ;
390+ self . skip_whitespace ( ) ;
391+ if !self . check ( Token :: RightBrace ) {
392+ self . match_token ( Token :: Comma ) ;
393+ self . skip_whitespace ( ) ;
394+ }
395+ }
396+ self . consume ( Token :: RightBrace ) ?;
397+ Ok ( Statement :: ExpressionStatement {
398+ expression : Expression :: ObjectLiteral { properties } ,
399+ } )
400+ }
401+
354402 fn parse_parallel_step_statement ( & mut self ) -> Result < Statement , ParseError > {
355403
356404 self . consume ( Token :: Parallel ) ?;
@@ -688,8 +736,30 @@ impl Parser {
688736 self . consume ( Token :: Flow ) ?;
689737 let name = self . consume_identifier ( ) ?;
690738 self . consume ( Token :: LeftBrace ) ?;
739+ let mut uses = Vec :: new ( ) ;
691740 let mut steps = Vec :: new ( ) ;
692741
742+ while !self . check ( Token :: RightBrace ) {
743+ self . skip_whitespace ( ) ;
744+ if self . check ( Token :: RightBrace ) {
745+ break ;
746+ }
747+
748+ if self . match_token ( Token :: Use ) {
749+ let flow_name = self . consume_identifier ( ) ?;
750+ uses. push ( flow_name) ;
751+ self . skip_whitespace ( ) ;
752+ self . consume_semicolon_optional ( ) ;
753+ continue ;
754+ }
755+
756+ if self . check ( Token :: Step ) || self . check ( Token :: Parallel ) {
757+ break ;
758+ }
759+
760+ break ;
761+ }
762+
693763 while !self . check ( Token :: RightBrace ) {
694764 self . skip_whitespace ( ) ;
695765 if self . check ( Token :: RightBrace ) {
@@ -738,19 +808,38 @@ impl Parser {
738808 None
739809 } ;
740810 self . consume ( Token :: LeftBrace ) ?;
741- let statements = self . parse_block ( ) ?;
811+ let mut statements = Vec :: new ( ) ;
812+ let mut output = None ;
813+
814+ while !self . check ( Token :: RightBrace ) && !self . is_at_end ( ) {
815+ self . skip_whitespace ( ) ;
816+ if self . check ( Token :: RightBrace ) {
817+ break ;
818+ }
819+
820+ if self . check ( Token :: Output ) {
821+ let output_stmt = self . parse_output_statement ( ) ?;
822+ if let Statement :: ExpressionStatement { expression } = output_stmt {
823+ output = Some ( expression) ;
824+ }
825+ } else {
826+ statements. push ( self . parse_statement ( ) ?) ;
827+ }
828+ }
829+
742830 self . consume ( Token :: RightBrace ) ?;
743831 steps. push ( FlowStep {
744832 name : step_name,
745833 statements,
746834 parallel,
747835 condition,
748836 retry,
837+ output,
749838 } ) ;
750839 }
751840
752841 self . consume ( Token :: RightBrace ) ?;
753- Ok ( Statement :: FlowStatement { name, steps } )
842+ Ok ( Statement :: FlowStatement { name, uses , steps } )
754843 }
755844
756845 fn parse_step_statement ( & mut self ) -> Result < Statement , ParseError > {
0 commit comments