]> git.lizzy.rs Git - rust.git/blob - src/tools/jsondoclint/src/main.rs
Auto merge of #101030 - woppopo:const_location, r=scottmcm
[rust.git] / src / tools / jsondoclint / src / main.rs
1 use std::env;
2
3 use anyhow::{anyhow, bail, Result};
4 use fs_err as fs;
5 use rustdoc_json_types::{Crate, Id, FORMAT_VERSION};
6 use serde_json::Value;
7
8 pub(crate) mod item_kind;
9 mod json_find;
10 mod validator;
11
12 #[derive(Debug)]
13 struct Error {
14     kind: ErrorKind,
15     id: Id,
16 }
17
18 #[derive(Debug)]
19 enum ErrorKind {
20     NotFound,
21     Custom(String),
22 }
23
24 fn main() -> Result<()> {
25     let path = env::args().nth(1).ok_or_else(|| anyhow!("no path given"))?;
26     let contents = fs::read_to_string(&path)?;
27     let krate: Crate = serde_json::from_str(&contents)?;
28     assert_eq!(krate.format_version, FORMAT_VERSION);
29
30     let mut validator = validator::Validator::new(&krate);
31     validator.check_crate();
32
33     if !validator.errs.is_empty() {
34         for err in validator.errs {
35             match err.kind {
36                 ErrorKind::NotFound => {
37                     let krate_json: Value = serde_json::from_str(&contents)?;
38
39                     let sels =
40                         json_find::find_selector(&krate_json, &Value::String(err.id.0.clone()));
41                     match &sels[..] {
42                         [] => unreachable!(
43                             "id must be in crate, or it wouldn't be reported as not found"
44                         ),
45                         [sel] => eprintln!(
46                             "{} not in index or paths, but refered to at '{}'",
47                             err.id.0,
48                             json_find::to_jsonpath(&sel)
49                         ),
50                         [sel, ..] => eprintln!(
51                             "{} not in index or paths, but refered to at '{}' and more",
52                             err.id.0,
53                             json_find::to_jsonpath(&sel)
54                         ),
55                     }
56                 }
57                 ErrorKind::Custom(msg) => eprintln!("{}: {}", err.id.0, msg),
58             }
59         }
60         bail!("Errors validating json {path}");
61     }
62
63     Ok(())
64 }