// Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. #![feature(rustc_private, rustdoc)] extern crate syntax; extern crate rustdoc; extern crate serialize as rustc_serialize; use std::collections::BTreeMap; use std::fs::{read_dir, File}; use std::io::{Read, Write}; use std::path::Path; use std::error::Error; use syntax::diagnostics::metadata::{get_metadata_dir, ErrorMetadataMap}; use rustdoc::html::markdown::Markdown; use rustc_serialize::json; /// Load all the metadata files from `metadata_dir` into an in-memory map. fn load_all_errors(metadata_dir: &Path) -> Result> { let mut all_errors = BTreeMap::new(); for entry in try!(read_dir(metadata_dir)) { let path = try!(entry).path(); let mut metadata_str = String::new(); try!( File::open(&path).and_then(|mut f| f.read_to_string(&mut metadata_str)) ); let some_errors: ErrorMetadataMap = try!(json::decode(&metadata_str)); for (err_code, info) in some_errors { all_errors.insert(err_code, info); } } Ok(all_errors) } /// Output an HTML page for the errors in `err_map` to `output_path`. fn render_error_page(err_map: &ErrorMetadataMap, output_path: &Path) -> Result<(), Box> { let mut output_file = try!(File::create(output_path)); try!(write!(&mut output_file, r##" Rust Compiler Error Index "## )); try!(write!(&mut output_file, "

Rust Compiler Error Index

\n")); for (err_code, info) in err_map { // Enclose each error in a div so they can be shown/hidden en masse. let desc_desc = match info.description { Some(_) => "error-described", None => "error-undescribed" }; let use_desc = match info.use_site { Some(_) => "error-used", None => "error-unused" }; try!(write!(&mut output_file, "
", desc_desc, use_desc)); // Error title (with self-link). try!(write!(&mut output_file, "

{0}

\n", err_code )); // Description rendered as markdown. match info.description { Some(ref desc) => try!(write!(&mut output_file, "{}", Markdown(desc))), None => try!(write!(&mut output_file, "

No description.

\n")) } try!(write!(&mut output_file, "
\n")); } try!(write!(&mut output_file, "\n")); Ok(()) } fn main_with_result() -> Result<(), Box> { let metadata_dir = get_metadata_dir(); let err_map = try!(load_all_errors(&metadata_dir)); try!(render_error_page(&err_map, Path::new("doc/error-index.html"))); Ok(()) } fn main() { if let Err(e) = main_with_result() { panic!("{}", e.description()); } }