]> git.lizzy.rs Git - rust.git/blob - src/error-index-generator/main.rs
Auto merge of #26456 - Manishearth:rollup, r=Manishearth
[rust.git] / src / error-index-generator / main.rs
1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 #![feature(rustc_private, rustdoc)]
12
13 extern crate syntax;
14 extern crate rustdoc;
15 extern crate serialize as rustc_serialize;
16
17 use std::collections::BTreeMap;
18 use std::fs::{read_dir, File};
19 use std::io::{Read, Write};
20 use std::env;
21 use std::path::Path;
22 use std::error::Error;
23
24 use syntax::diagnostics::metadata::{get_metadata_dir, ErrorMetadataMap};
25
26 use rustdoc::html::markdown::Markdown;
27 use rustc_serialize::json;
28
29 /// Load all the metadata files from `metadata_dir` into an in-memory map.
30 fn load_all_errors(metadata_dir: &Path) -> Result<ErrorMetadataMap, Box<Error>> {
31     let mut all_errors = BTreeMap::new();
32
33     for entry in try!(read_dir(metadata_dir)) {
34         let path = try!(entry).path();
35
36         let mut metadata_str = String::new();
37         try!(
38             File::open(&path).and_then(|mut f|
39             f.read_to_string(&mut metadata_str))
40         );
41
42         let some_errors: ErrorMetadataMap = try!(json::decode(&metadata_str));
43
44         for (err_code, info) in some_errors {
45             all_errors.insert(err_code, info);
46         }
47     }
48
49     Ok(all_errors)
50 }
51
52 /// Output an HTML page for the errors in `err_map` to `output_path`.
53 fn render_error_page(err_map: &ErrorMetadataMap, output_path: &Path) -> Result<(), Box<Error>> {
54     let mut output_file = try!(File::create(output_path));
55
56     try!(write!(&mut output_file,
57 r##"<!DOCTYPE html>
58 <html>
59 <head>
60 <title>Rust Compiler Error Index</title>
61 <meta charset="utf-8">
62 <!-- Include rust.css after main.css so its rules take priority. -->
63 <link rel="stylesheet" type="text/css" href="main.css"/>
64 <link rel="stylesheet" type="text/css" href="rust.css"/>
65 <style>
66 .error-undescribed {{
67     display: none;
68 }}
69 </style>
70 </head>
71 <body>
72 "##
73     ));
74
75     try!(write!(&mut output_file, "<h1>Rust Compiler Error Index</h1>\n"));
76
77     for (err_code, info) in err_map {
78         // Enclose each error in a div so they can be shown/hidden en masse.
79         let desc_desc = match info.description {
80             Some(_) => "error-described",
81             None => "error-undescribed"
82         };
83         let use_desc = match info.use_site {
84             Some(_) => "error-used",
85             None => "error-unused"
86         };
87         try!(write!(&mut output_file, "<div class=\"{} {}\">", desc_desc, use_desc));
88
89         // Error title (with self-link).
90         try!(write!(&mut output_file,
91             "<h2 id=\"{0}\" class=\"section-header\"><a href=\"#{0}\">{0}</a></h2>\n",
92             err_code
93         ));
94
95         // Description rendered as markdown.
96         match info.description {
97             Some(ref desc) => try!(write!(&mut output_file, "{}", Markdown(desc))),
98             None => try!(write!(&mut output_file, "<p>No description.</p>\n"))
99         }
100
101         try!(write!(&mut output_file, "</div>\n"));
102     }
103
104     try!(write!(&mut output_file, "</body>\n</html>"));
105
106     Ok(())
107 }
108
109 fn main_with_result() -> Result<(), Box<Error>> {
110     let build_arch = try!(env::var("CFG_BUILD"));
111     let metadata_dir = get_metadata_dir(&build_arch);
112     let err_map = try!(load_all_errors(&metadata_dir));
113     try!(render_error_page(&err_map, Path::new("doc/error-index.html")));
114     Ok(())
115 }
116
117 fn main() {
118     if let Err(e) = main_with_result() {
119         panic!("{}", e.description());
120     }
121 }