@@ -802,7 +802,15 @@ commit_required: false
802802
803803 #[ test]
804804 fn test_workflow_config_with_new_syntax ( ) {
805- // Test parsing the exact structure used in coverage.yml
805+ let config = parse_test_workflow_config ( ) ;
806+ assert_eq ! ( config. commands. len( ) , 3 ) ;
807+
808+ verify_coverage_command ( & config. commands [ 0 ] ) ;
809+ verify_implement_spec_command ( & config. commands [ 1 ] ) ;
810+ verify_lint_command ( & config. commands [ 2 ] ) ;
811+ }
812+
813+ fn parse_test_workflow_config ( ) -> WorkflowConfig {
806814 let yaml = r#"
807815commands:
808816 - claude: "/mmm-coverage"
@@ -820,65 +828,72 @@ commands:
820828 commit_required: false
821829"# ;
822830
823- let config: WorkflowConfig = match serde_yaml:: from_str ( yaml) {
824- Ok ( c) => c,
825- Err ( e) => {
826- // Try to parse just the commands array to debug
827- let yaml_value: serde_yaml:: Value = serde_yaml:: from_str ( yaml) . unwrap ( ) ;
828- if let Some ( commands) = yaml_value. get ( "commands" ) {
829- println ! ( "Commands value: {commands:?}" ) ;
830-
831- // Try to parse each command
832- if let Some ( seq) = commands. as_sequence ( ) {
833- for ( i, cmd) in seq. iter ( ) . enumerate ( ) {
834- println ! ( "\n Command {i}: {cmd:?}" ) ;
835- match serde_yaml:: from_value :: < WorkflowStepCommand > ( cmd. clone ( ) ) {
836- Ok ( _parsed) => println ! ( " Parsed as WorkflowStepCommand: success" ) ,
837- Err ( e2) => println ! ( " Failed as WorkflowStepCommand: {e2}" ) ,
838- }
839- match serde_yaml:: from_value :: < WorkflowCommand > ( cmd. clone ( ) ) {
840- Ok ( parsed) => println ! ( " Parsed as WorkflowCommand: {parsed:?}" ) ,
841- Err ( e2) => println ! ( " Failed as WorkflowCommand: {e2}" ) ,
842- }
843- }
844- }
845- }
846- panic ! ( "Failed to parse WorkflowConfig: {e}" ) ;
831+ serde_yaml:: from_str ( yaml) . unwrap_or_else ( |e| {
832+ debug_workflow_parsing_error ( yaml, & e) ;
833+ panic ! ( "Failed to parse WorkflowConfig: {e}" ) ;
834+ } )
835+ }
836+
837+ fn debug_workflow_parsing_error ( yaml : & str , _error : & serde_yaml:: Error ) {
838+ let yaml_value: serde_yaml:: Value = serde_yaml:: from_str ( yaml) . unwrap ( ) ;
839+ if let Some ( commands) = yaml_value. get ( "commands" ) {
840+ println ! ( "Commands value: {commands:?}" ) ;
841+ if let Some ( seq) = commands. as_sequence ( ) {
842+ debug_command_sequence ( seq) ;
847843 }
848- } ;
849- assert_eq ! ( config. commands. len( ) , 3 ) ;
844+ }
845+ }
846+
847+ fn debug_command_sequence ( seq : & [ serde_yaml:: Value ] ) {
848+ for ( i, cmd) in seq. iter ( ) . enumerate ( ) {
849+ println ! ( "\n Command {i}: {cmd:?}" ) ;
850+ try_parse_as :: < WorkflowStepCommand > ( cmd, "WorkflowStepCommand" ) ;
851+ try_parse_as :: < WorkflowCommand > ( cmd, "WorkflowCommand" ) ;
852+ }
853+ }
850854
851- // Verify first command
852- match & config. commands [ 0 ] {
855+ fn try_parse_as < T : serde:: de:: DeserializeOwned + std:: fmt:: Debug > (
856+ value : & serde_yaml:: Value ,
857+ type_name : & str ,
858+ ) {
859+ match serde_yaml:: from_value :: < T > ( value. clone ( ) ) {
860+ Ok ( parsed) => println ! ( " Parsed as {type_name}: {parsed:?}" ) ,
861+ Err ( e) => println ! ( " Failed as {type_name}: {e}" ) ,
862+ }
863+ }
864+
865+ fn verify_coverage_command ( command : & WorkflowCommand ) {
866+ match command {
853867 WorkflowCommand :: WorkflowStep ( step) => {
854868 assert_eq ! ( step. claude, Some ( "/mmm-coverage" . to_string( ) ) ) ;
855869 assert_eq ! ( step. id, Some ( "coverage" . to_string( ) ) ) ;
856870 assert ! ( !step. commit_required) ;
857871 assert ! ( step. outputs. is_some( ) ) ;
858872 assert ! ( step. analysis. is_some( ) ) ;
859873 }
860- _ => panic ! ( "Expected WorkflowStep variant for first command" ) ,
874+ _ => panic ! ( "Expected WorkflowStep variant for coverage command" ) ,
861875 }
876+ }
862877
863- // Verify second command
864- match & config . commands [ 1 ] {
878+ fn verify_implement_spec_command ( command : & WorkflowCommand ) {
879+ match command {
865880 WorkflowCommand :: WorkflowStep ( step) => {
866881 assert_eq ! (
867882 step. claude,
868883 Some ( "/mmm-implement-spec ${coverage.spec}" . to_string( ) )
869884 ) ;
870- // inputs removed - arguments now passed directly in command string
871885 }
872- _ => panic ! ( "Expected WorkflowStep variant for second command" ) ,
886+ _ => panic ! ( "Expected WorkflowStep variant for implement-spec command" ) ,
873887 }
888+ }
874889
875- // Verify third command
876- match & config . commands [ 2 ] {
890+ fn verify_lint_command ( command : & WorkflowCommand ) {
891+ match command {
877892 WorkflowCommand :: WorkflowStep ( step) => {
878893 assert_eq ! ( step. claude, Some ( "/mmm-lint" . to_string( ) ) ) ;
879894 assert ! ( !step. commit_required) ;
880895 }
881- _ => panic ! ( "Expected WorkflowStep variant for third command" ) ,
896+ _ => panic ! ( "Expected WorkflowStep variant for lint command" ) ,
882897 }
883898 }
884899}
0 commit comments