Skip to content

Commit 2d01b2b

Browse files
authored
Merge pull request #54 from matt-cornell/refactor.error-handling
Handle IO errors more nicely
2 parents d35dfe5 + effbcb2 commit 2d01b2b

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

src/main.rs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#![allow(non_snake_case)]
12
use colored::Colorize;
23
use inkwell::targets::*;
34
use inkwell::execution_engine::FunctionLookupError;
@@ -32,8 +33,7 @@ const INIT_NEEDED: InitializationConfig = InitializationConfig {
3233
info: true,
3334
machine_code: true
3435
};
35-
#[allow(non_snake_case)]
36-
fn main() -> Result<(), Box<dyn std::error::Error>> {
36+
fn driver() -> Result<(), Box<dyn std::error::Error>> {
3737
let ERROR = &"error".bright_red().bold();
3838
let WARNING = &"warning".bright_yellow().bold();
3939
let MODULE = &"module".blue().bold();
@@ -89,16 +89,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
8989
let file = cobalt::errors::files::add_file("<command line>".to_string(), arg.clone());
9090
let files = &*cobalt::errors::files::FILES.read().unwrap();
9191
let (toks, errs) = cobalt::parser::lex(arg.as_str(), (file, 0), &flags);
92-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
93-
for tok in toks {term::emit(&mut stdout, &config, files, &Diagnostic::note().with_message(format!("{tok}")).with_labels(vec![Label::primary(tok.loc.0, tok.loc.1)])).unwrap();}
92+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
93+
for tok in toks {term::emit(&mut stdout, &config, files, &Diagnostic::note().with_message(format!("{tok}")).with_labels(vec![Label::primary(tok.loc.0, tok.loc.1)]))?;}
9494
}
9595
else {
9696
let code = std::fs::read_to_string(arg.as_str())?;
9797
let file = cobalt::errors::files::add_file(arg.clone(), code.clone());
9898
let files = &*cobalt::errors::files::FILES.read().unwrap();
9999
let (toks, errs) = cobalt::parser::lex(code.as_str(), (file, 0), &flags);
100-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
101-
for tok in toks {term::emit(&mut stdout, &config, files, &Diagnostic::note().with_message(format!("{tok}")).with_labels(vec![Label::primary(tok.loc.0, tok.loc.1)])).unwrap();}
100+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
101+
for tok in toks {term::emit(&mut stdout, &config, files, &Diagnostic::note().with_message(format!("{tok}")).with_labels(vec![Label::primary(tok.loc.0, tok.loc.1)]))?;}
102102
}
103103
}
104104
if nfcl {
@@ -139,7 +139,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
139139
let (toks, mut errs) = cobalt::parser::lex(arg.as_str(), (file, 0), &flags);
140140
let (ast, mut es) = cobalt::parser::parse(toks.as_slice(), &flags);
141141
errs.append(&mut es);
142-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
142+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
143143
if loc {print!("{:#}", ast)}
144144
else {print!("{}", ast)}
145145
}
@@ -150,7 +150,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
150150
let (toks, mut errs) = cobalt::parser::lex(code.as_str(), (file, 0), &flags);
151151
let (ast, mut es) = cobalt::parser::parse(toks.as_slice(), &flags);
152152
errs.append(&mut es);
153-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
153+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
154154
if loc {print!("{:#}", ast)}
155155
else {print!("{}", ast)}
156156
}
@@ -210,14 +210,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
210210
let file = cobalt::errors::files::add_file(in_file.to_string(), code.clone());
211211
let files = &*cobalt::errors::files::FILES.read().unwrap();
212212
let (toks, errs) = cobalt::parser::lex(code.as_str(), (file, 0), &flags);
213-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
213+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
214214
let (ast, errs) = cobalt::parser::ast::parse(toks.as_slice(), &flags);
215-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
215+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
216216
let ink_ctx = inkwell::context::Context::create();
217217
let ctx = cobalt::context::CompCtx::new(&ink_ctx, in_file);
218218
ctx.module.set_triple(&TargetMachine::get_default_triple());
219219
let (_, errs) = ast.codegen(&ctx);
220-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap();}
220+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?;}
221221
if let Err(msg) = ctx.module.verify() {
222222
eprintln!("{ERROR}: {MODULE}: {}", msg.to_string());
223223
fail = true;
@@ -483,19 +483,19 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
483483
let file = cobalt::errors::files::add_file(in_file.to_string(), code.clone());
484484
let files = &*cobalt::errors::files::FILES.read().unwrap();
485485
let (toks, errs) = cobalt::parser::lex(code.as_str(), (file, 0), &ctx.flags);
486-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
486+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
487487
overall_fail |= fail;
488488
fail = false;
489489
if fail && !continue_if_err {exit(101)}
490490
let (ast, errs) = cobalt::parser::ast::parse(toks.as_slice(), &ctx.flags);
491-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
491+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
492492
overall_fail |= fail;
493493
fail = false;
494494
if fail && !continue_if_err {exit(101)}
495495
let (_, errs) = ast.codegen(&ctx);
496496
overall_fail |= fail;
497497
fail = false;
498-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
498+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
499499
if fail && !continue_if_err {exit(101)}
500500
if let Err(msg) = ctx.module.verify() {
501501
eprintln!("{ERROR}: {MODULE}: {}", msg.to_string());
@@ -733,19 +733,19 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
733733
let file = cobalt::errors::files::add_file(in_file.to_string(), code.clone());
734734
let files = &*cobalt::errors::files::FILES.read().unwrap();
735735
let (toks, errs) = cobalt::parser::lex(code.as_str(), (file, 0), &flags);
736-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
736+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
737737
overall_fail |= fail;
738738
fail = false;
739739
if fail && !continue_if_err {exit(101)}
740740
let (ast, errs) = cobalt::parser::ast::parse(toks.as_slice(), &flags);
741-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
741+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
742742
overall_fail |= fail;
743743
fail = false;
744744
if fail && !continue_if_err {exit(101)}
745745
let (_, errs) = ast.codegen(&ctx);
746746
overall_fail |= fail;
747747
fail = false;
748-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
748+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
749749
if fail && !continue_if_err {exit(101)}
750750
if let Err(msg) = ctx.module.verify() {
751751
eprintln!("{ERROR}: {MODULE}: {}", msg.to_string());
@@ -899,11 +899,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
899899
let file = cobalt::errors::files::add_file(in_file.to_string(), code.clone());
900900
let files = &*cobalt::errors::files::FILES.read().unwrap();
901901
let (toks, errs) = cobalt::parser::lex(code.as_str(), (file, 0), &ctx.flags);
902-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
902+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
903903
let (ast, errs) = cobalt::parser::ast::parse(toks.as_slice(), &ctx.flags);
904-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
904+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
905905
let (_, errs) = ast.codegen(&ctx);
906-
for err in errs {term::emit(&mut stdout, &config, files, &err.0).unwrap(); fail |= err.is_err();}
906+
for err in errs {term::emit(&mut stdout, &config, files, &err.0)?; fail |= err.is_err();}
907907
if let Err(msg) = ctx.module.verify() {
908908
eprintln!("{ERROR}: {MODULE}: {}", msg.to_string());
909909
exit(101)
@@ -1218,3 +1218,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
12181218
};
12191219
Ok(())
12201220
}
1221+
fn main() {
1222+
if let Err(err) = driver() {
1223+
let ERROR = &"error".bright_red().bold();
1224+
eprintln!("{ERROR}: {err}");
1225+
exit(100);
1226+
}
1227+
}

0 commit comments

Comments
 (0)