@@ -218,6 +218,8 @@ pub struct RenderOptions {
218218 pub extern_html_root_urls : BTreeMap < String , String > ,
219219 /// If present, suffix added to CSS/JavaScript files when referencing them in generated pages.
220220 pub resource_suffix : String ,
221+ /// Links displayed on the crate root page.
222+ pub crate_root_links : BTreeMap < String , String > ,
221223 /// Whether to run the static CSS/JavaScript through a minifier when outputting them. `true` by
222224 /// default.
223225 //
@@ -270,6 +272,36 @@ impl Options {
270272 /// Parses the given command-line for options. If an error message or other early-return has
271273 /// been printed, returns `Err` with the exit code.
272274 pub fn from_matches ( matches : & getopts:: Matches ) -> Result < Options , i32 > {
275+ fn parse_keyval_opt_internal (
276+ matches : & getopts:: Matches ,
277+ opt_name : & ' static str ,
278+ empty_err : & ' static str ,
279+ invalid_form_err : & ' static str ,
280+ ) -> Result < BTreeMap < String , String > , & ' static str > {
281+ let mut externs = BTreeMap :: new ( ) ;
282+ for arg in & ( matches) . opt_strs ( opt_name) {
283+ let mut parts = arg. splitn ( 2 , '=' ) ;
284+ let name = parts. next ( ) . ok_or ( empty_err) ?;
285+ let url = parts. next ( ) . ok_or ( invalid_form_err) ?;
286+ externs. insert ( name. to_string ( ) , url. to_string ( ) ) ;
287+ }
288+
289+ Ok ( externs)
290+ }
291+ /// Extracts key-value arguments (such as for `--extern-html-root-url`) from `matches` and returns
292+ /// a map of crate names to the given URLs. If an argument was ill-formed, returns an error
293+ /// describing the issue.
294+ macro_rules! parse_keyval_opt {
295+ ( $matches: expr, $opt_name: literal) => {
296+ parse_keyval_opt_internal(
297+ $matches,
298+ $opt_name,
299+ concat!( "--" , $opt_name, "must not be empty" ) ,
300+ concat!( "--" , $opt_name, "must be of the form name=url" ) ,
301+ )
302+ } ;
303+ }
304+
273305 // Check for unstable options.
274306 nightly_options:: check_nightly_options ( & matches, & opts ( ) ) ;
275307
@@ -366,7 +398,15 @@ impl Options {
366398 . map ( |s| SearchPath :: from_cli_opt ( s, error_format) )
367399 . collect ( ) ;
368400 let externs = parse_externs ( & matches, & debugging_options, error_format) ;
369- let extern_html_root_urls = match parse_extern_html_roots ( & matches) {
401+ let extern_html_root_urls = match parse_keyval_opt ! ( & matches, "extern-html-root-url" ) {
402+ Ok ( ex) => ex,
403+ Err ( err) => {
404+ diag. struct_err ( err) . emit ( ) ;
405+ return Err ( 1 ) ;
406+ }
407+ } ;
408+
409+ let crate_root_links = match parse_keyval_opt ! ( & matches, "crate-root-link" ) {
370410 Ok ( ex) => ex,
371411 Err ( err) => {
372412 diag. struct_err ( err) . emit ( ) ;
@@ -609,6 +649,7 @@ impl Options {
609649 generate_search_filter,
610650 document_private,
611651 document_hidden,
652+ crate_root_links,
612653 } ,
613654 output_format,
614655 } )
@@ -654,20 +695,3 @@ fn check_deprecated_options(matches: &getopts::Matches, diag: &rustc_errors::Han
654695 }
655696 }
656697}
657-
658- /// Extracts `--extern-html-root-url` arguments from `matches` and returns a map of crate names to
659- /// the given URLs. If an `--extern-html-root-url` argument was ill-formed, returns an error
660- /// describing the issue.
661- fn parse_extern_html_roots (
662- matches : & getopts:: Matches ,
663- ) -> Result < BTreeMap < String , String > , & ' static str > {
664- let mut externs = BTreeMap :: new ( ) ;
665- for arg in & matches. opt_strs ( "extern-html-root-url" ) {
666- let mut parts = arg. splitn ( 2 , '=' ) ;
667- let name = parts. next ( ) . ok_or ( "--extern-html-root-url must not be empty" ) ?;
668- let url = parts. next ( ) . ok_or ( "--extern-html-root-url must be of the form name=url" ) ?;
669- externs. insert ( name. to_string ( ) , url. to_string ( ) ) ;
670- }
671-
672- Ok ( externs)
673- }
0 commit comments