diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 72 |
1 files changed, 69 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index e1d4752..503688e 100644 --- a/src/main.rs +++ b/src/main.rs | |||
@@ -1,5 +1,6 @@ | |||
1 | //mod doxygen; | 1 | //mod doxygen; |
2 | mod cli; | 2 | mod cli; |
3 | mod config; | ||
3 | mod entities; | 4 | mod entities; |
4 | mod generator; | 5 | mod generator; |
5 | mod pandoc; | 6 | mod pandoc; |
@@ -8,14 +9,63 @@ mod parsing; | |||
8 | #[macro_use] | 9 | #[macro_use] |
9 | extern crate log; | 10 | extern crate log; |
10 | 11 | ||
11 | use cli::Command; | 12 | use cli::{Command, ConfigCommand}; |
12 | use generator::generate; | 13 | use generator::generate; |
13 | use parsing::parse_file; | 14 | use parsing::parse_file; |
14 | 15 | ||
15 | use anyhow::Result; | 16 | use anyhow::{Context, Result}; |
17 | use codemap::CodeMap; | ||
18 | use codemap_diagnostic::{Diagnostic, Emitter, Level}; | ||
16 | use structopt::StructOpt; | 19 | use structopt::StructOpt; |
17 | 20 | ||
18 | fn main() -> Result<()> { | 21 | fn into_diagnostic(err: &anyhow::Error) -> Diagnostic { |
22 | if let Some(err) = err.downcast_ref::<config::ConfigLoadError>() { | ||
23 | err.into() | ||
24 | } else { | ||
25 | Diagnostic { | ||
26 | level: Level::Error, | ||
27 | message: err.to_string(), | ||
28 | code: None, | ||
29 | spans: vec![], | ||
30 | } | ||
31 | } | ||
32 | } | ||
33 | |||
34 | fn main() { | ||
35 | let mut codemap = CodeMap::new(); | ||
36 | |||
37 | match start(&mut codemap) { | ||
38 | Ok(()) => {} | ||
39 | Err(err) => { | ||
40 | let mut emitter = | ||
41 | Emitter::stderr(codemap_diagnostic::ColorConfig::Auto, Some(&codemap)); | ||
42 | |||
43 | let mut diagnostics = Vec::new(); | ||
44 | diagnostics.push(into_diagnostic(&err)); | ||
45 | |||
46 | if let Some(mut source) = err.source() { | ||
47 | diagnostics.push(Diagnostic { | ||
48 | level: Level::Note, | ||
49 | message: format!("Caused by: {}", source), | ||
50 | code: None, | ||
51 | spans: vec![], | ||
52 | }); | ||
53 | while let Some(source2) = source.source() { | ||
54 | source = source2; | ||
55 | diagnostics.push(Diagnostic { | ||
56 | level: Level::Note, | ||
57 | message: format!("Caused by: {}", source), | ||
58 | code: None, | ||
59 | spans: vec![], | ||
60 | }); | ||
61 | } | ||
62 | } | ||
63 | emitter.emit(&diagnostics); | ||
64 | } | ||
65 | } | ||
66 | } | ||
67 | |||
68 | fn start(codemap: &mut CodeMap) -> Result<()> { | ||
19 | let cli = cli::Cli::from_args(); | 69 | let cli = cli::Cli::from_args(); |
20 | pretty_env_logger::formatted_builder() | 70 | pretty_env_logger::formatted_builder() |
21 | .filter( | 71 | .filter( |
@@ -30,6 +80,9 @@ fn main() -> Result<()> { | |||
30 | ) | 80 | ) |
31 | .try_init()?; | 81 | .try_init()?; |
32 | 82 | ||
83 | std::env::set_current_dir(&cli.directory) | ||
84 | .with_context(|| format!("Cannot change current directory to: {:?}", cli.directory))?; | ||
85 | |||
33 | match cli.command { | 86 | match cli.command { |
34 | Command::Generate { file } => { | 87 | Command::Generate { file } => { |
35 | let extra_args = cli.extra_arg.iter().flatten().map(AsRef::as_ref).collect(); | 88 | let extra_args = cli.extra_arg.iter().flatten().map(AsRef::as_ref).collect(); |
@@ -38,6 +91,19 @@ fn main() -> Result<()> { | |||
38 | let base_output_dir = std::path::Path::new("doc"); | 91 | let base_output_dir = std::path::Path::new("doc"); |
39 | generate(&base_output_dir, manager)?; | 92 | generate(&base_output_dir, manager)?; |
40 | } | 93 | } |
94 | Command::Config { | ||
95 | command: ConfigCommand::Default, | ||
96 | } => { | ||
97 | print!("{}", toml::to_string_pretty(&config::Config::default())?); | ||
98 | } | ||
99 | Command::Config { | ||
100 | command: ConfigCommand::Show, | ||
101 | } => { | ||
102 | print!( | ||
103 | "{}", | ||
104 | toml::to_string_pretty(&config::load_config(".", codemap)?)? | ||
105 | ); | ||
106 | } | ||
41 | } | 107 | } |
42 | 108 | ||
43 | Ok(()) | 109 | Ok(()) |