11use std:: collections:: BTreeMap ;
22use std:: ffi:: OsStr ;
3+ use std:: convert:: TryFrom ;
34use std:: fmt;
45use std:: path:: PathBuf ;
56
@@ -24,6 +25,33 @@ use crate::opts;
2425use crate :: passes:: { self , Condition , DefaultPassOption } ;
2526use crate :: theme;
2627
28+ #[ derive( Clone , Copy , PartialEq , Eq , Debug ) ]
29+ pub enum OutputFormat {
30+ Json ,
31+ HTML ,
32+ }
33+
34+ impl OutputFormat {
35+ pub fn is_json ( & self ) -> bool {
36+ match * self {
37+ OutputFormat :: Json => true ,
38+ _ => false ,
39+ }
40+ }
41+ }
42+
43+ impl TryFrom < & str > for OutputFormat {
44+ type Error = String ;
45+
46+ fn try_from ( value : & str ) -> Result < Self , Self :: Error > {
47+ match value {
48+ "json" => Ok ( OutputFormat :: Json ) ,
49+ "html" => Ok ( OutputFormat :: HTML ) ,
50+ _ => Err ( format ! ( "unknown output format `{}`" , value) ) ,
51+ }
52+ }
53+ }
54+
2755/// Configuration options for rustdoc.
2856#[ derive( Clone ) ]
2957pub struct Options {
@@ -115,6 +143,8 @@ pub struct Options {
115143 pub crate_version : Option < String > ,
116144 /// Collected options specific to outputting final pages.
117145 pub render_options : RenderOptions ,
146+ /// Output format rendering (used only for "show-coverage" option for the moment)
147+ pub output_format : Option < OutputFormat > ,
118148}
119149
120150impl fmt:: Debug for Options {
@@ -425,14 +455,6 @@ impl Options {
425455 }
426456 }
427457
428- match matches. opt_str ( "w" ) . as_ref ( ) . map ( |s| & * * s) {
429- Some ( "html" ) | None => { }
430- Some ( s) => {
431- diag. struct_err ( & format ! ( "unknown output format: {}" , s) ) . emit ( ) ;
432- return Err ( 1 ) ;
433- }
434- }
435-
436458 let index_page = matches. opt_str ( "index-page" ) . map ( |s| PathBuf :: from ( & s) ) ;
437459 if let Some ( ref index_page) = index_page {
438460 if !index_page. is_file ( ) {
@@ -469,6 +491,23 @@ impl Options {
469491 }
470492 } ;
471493
494+ let output_format = match matches. opt_str ( "output-format" ) {
495+ Some ( s) => match OutputFormat :: try_from ( s. as_str ( ) ) {
496+ Ok ( o) => {
497+ if o. is_json ( ) && !show_coverage {
498+ diag. struct_err ( "json output format isn't supported for doc generation" )
499+ . emit ( ) ;
500+ return Err ( 1 ) ;
501+ }
502+ Some ( o)
503+ }
504+ Err ( e) => {
505+ diag. struct_err ( & e) . emit ( ) ;
506+ return Err ( 1 ) ;
507+ }
508+ }
509+ None => None ,
510+ } ;
472511 let crate_name = matches. opt_str ( "crate-name" ) ;
473512 let proc_macro_crate = crate_types. contains ( & CrateType :: ProcMacro ) ;
474513 let playground_url = matches. opt_str ( "playground-url" ) ;
@@ -553,6 +592,7 @@ impl Options {
553592 generate_search_filter,
554593 generate_redirect_pages,
555594 } ,
595+ output_format,
556596 } )
557597 }
558598
@@ -568,6 +608,9 @@ fn check_deprecated_options(matches: &getopts::Matches, diag: &rustc_errors::Han
568608
569609 for flag in deprecated_flags. iter ( ) {
570610 if matches. opt_present ( flag) {
611+ if * flag == "output-format" && matches. opt_present ( "show-coverage" ) {
612+ continue ;
613+ }
571614 let mut err =
572615 diag. struct_warn ( & format ! ( "the '{}' flag is considered deprecated" , flag) ) ;
573616 err. warn (
0 commit comments