@@ -557,104 +557,93 @@ fn method_errors(
557557 Ok ( MethodErrors { codes : codes? } )
558558}
559559
560- fn trait_method (
560+ fn trait_methods_specific_to_content_type (
561561 op : & PathOperation ,
562562 prefix_length : usize ,
563563 ref_cache : & mut RefCache ,
564564) -> Result < Vec < Method > > {
565565 let ( result_code, result_type) = method_result ( & op. op . responses . responses , ref_cache) ?;
566566
567- let name = if let Some ( op_id) = & op. op . operation_id {
568- op_id. to_case ( Case :: Snake )
569- } else {
570- op. path . strip_prefix ( prefix_length) . method_name ( & op. method )
571- } ;
567+ let name = op
568+ . op
569+ . operation_id
570+ . as_ref ( )
571+ . map ( |op_id| op_id. to_case ( Case :: Snake ) )
572+ . unwrap_or_else ( || op. path . strip_prefix ( prefix_length) . method_name ( & op. method ) ) ;
572573
573574 let mut main_params = parameters ( op, ref_cache) ?;
574575
575576 if let Some ( body) = & op. op . request_body {
576577 let content_specific = request_body_params ( body, ref_cache) ?;
577578
578579 if let Some ( request_body_params) = content_specific. get_default_request_body_param ( ) {
579- for i in request_body_params {
580- main_params. push ( i. clone ( ) )
581- }
582-
583- Ok ( vec ! [ Method {
580+ main_params. extend ( request_body_params. iter ( ) . cloned ( ) ) ;
581+ return Ok ( vec ! [ create_method(
584582 name,
585- path: op. path. clone( ) ,
586- original_path: op. original_path. clone( ) ,
587- http_method: op. method. to_string( ) ,
588- params: main_params,
589- result: result_type,
590- result_status_code: result_code. clone( ) ,
591- errors: method_errors( & op. op. responses. responses, result_code, ref_cache) ?,
592- } ] )
593- } else {
594- let mut methods = vec ! [ ] ;
595-
596- for ( content_type, params) in content_specific. params {
597- if content_type. is_json ( ) {
598- let mut new_params = main_params. clone ( ) ;
583+ op,
584+ & main_params,
585+ result_type,
586+ result_code,
587+ ref_cache,
588+ ) ?] ) ;
589+ }
599590
600- for i in params {
601- new_params. push ( i)
602- }
591+ let mut methods = Vec :: new ( ) ;
592+ for ( content_type, params) in content_specific. params {
593+ let method_name = match_content_type ( content_type, & name) ?;
594+ let new_params = [ main_params. clone ( ) , params] . concat ( ) ;
595+ methods. push ( create_method (
596+ method_name,
597+ op,
598+ & new_params,
599+ result_type. clone ( ) ,
600+ result_code. clone ( ) ,
601+ ref_cache,
602+ ) ?) ;
603+ }
603604
604- let method_name = format ! ( "{}_json" , name) ;
605- methods. push ( Method {
606- name : method_name,
607- path : op. path . clone ( ) ,
608- original_path : op. original_path . clone ( ) ,
609- http_method : op. method . to_string ( ) ,
610- params : new_params. clone ( ) ,
611- result : result_type. clone ( ) ,
612- result_status_code : result_code. clone ( ) ,
613- errors : method_errors (
614- & op. op . responses . responses ,
615- result_code. clone ( ) ,
616- ref_cache,
617- ) ?,
618- } ) ;
619- } else if content_type. is_yaml ( ) {
620- let mut new_params = main_params. clone ( ) ;
621-
622- for i in params {
623- new_params. push ( i)
624- }
605+ Ok ( methods)
606+ } else {
607+ Ok ( vec ! [ create_method(
608+ name,
609+ op,
610+ & main_params,
611+ result_type,
612+ result_code,
613+ ref_cache,
614+ ) ?] )
615+ }
616+ }
625617
626- let method_name = format ! ( "{}_yaml" , name) ;
627-
628- methods. push ( Method {
629- name : method_name,
630- path : op. path . clone ( ) ,
631- original_path : op. original_path . clone ( ) ,
632- http_method : op. method . to_string ( ) ,
633- params : new_params. clone ( ) ,
634- result : result_type. clone ( ) ,
635- result_status_code : result_code. clone ( ) ,
636- errors : method_errors (
637- & op. op . responses . responses ,
638- result_code. clone ( ) ,
639- ref_cache,
640- ) ?,
641- } ) ;
642- }
643- }
618+ fn create_method (
619+ name : String ,
620+ op : & PathOperation ,
621+ params : & [ Param ] ,
622+ result_type : DataType ,
623+ result_code : StatusCode ,
624+ ref_cache : & mut RefCache ,
625+ ) -> Result < Method > {
626+ Ok ( Method {
627+ name,
628+ path : op. path . clone ( ) ,
629+ original_path : op. original_path . clone ( ) ,
630+ http_method : op. method . to_string ( ) ,
631+ params : params. to_vec ( ) ,
632+ result : result_type,
633+ result_status_code : result_code. clone ( ) ,
634+ errors : method_errors ( & op. op . responses . responses , result_code, ref_cache) ?,
635+ } )
636+ }
644637
645- Ok ( methods)
646- }
638+ fn match_content_type ( content_type : ContentType , base_name : & str ) -> Result < String > {
639+ if content_type. is_json ( ) {
640+ Ok ( format ! ( "{}_json" , base_name) )
641+ } else if content_type. is_yaml ( ) {
642+ Ok ( format ! ( "{}_yaml" , base_name) )
647643 } else {
648- Ok ( vec ! [ Method {
649- name,
650- path: op. path. clone( ) ,
651- original_path: op. original_path. clone( ) ,
652- http_method: op. method. to_string( ) ,
653- params: main_params,
654- result: result_type,
655- result_status_code: result_code. clone( ) ,
656- errors: method_errors( & op. op. responses. responses, result_code, ref_cache) ?,
657- } ] )
644+ Err ( Error :: unimplemented (
645+ "Multiple content types supported only for JSON and YAML" ,
646+ ) )
658647 }
659648}
660649
@@ -665,7 +654,7 @@ fn trait_methods(
665654) -> Result < Vec < Method > > {
666655 let res = operations
667656 . iter ( )
668- . map ( |op| trait_method ( op, prefix_length, ref_cache) )
657+ . map ( |op| trait_methods_specific_to_content_type ( op, prefix_length, ref_cache) )
669658 . collect :: < Result < Vec < Vec < _ > > > > ( ) ?;
670659
671660 Ok ( res. into_iter ( ) . flatten ( ) . collect ( ) )
0 commit comments