use std::process::ExitCode;
use qld::ParseOutcome;
use qld::diag::{Diagnostic, DiagnosticSink, Stderr};
fn main() -> ExitCode {
let args: Vec<_> = std::iter::once("ld".into())
.chain(std::env::args_os().skip(1))
.collect();
let diagnostics = Stderr::new(qld::PROGRAM_NAME);
match link(&args, &diagnostics) {
Ok(()) => ExitCode::SUCCESS,
Err(qld::Error::Reported { .. }) => ExitCode::FAILURE,
Err(error) => {
eprintln!("{}: error: {error}", qld::PROGRAM_NAME);
ExitCode::FAILURE
}
}
}
fn link(args: &[std::ffi::OsString], diagnostics: &dyn DiagnosticSink) -> qld::Result<()> {
let options = match qld::parse_gnu(args)? {
ParseOutcome::Link(options) => options,
ParseOutcome::Help => {
print!("{}", qld::args::usage());
return Ok(());
}
ParseOutcome::Version => {
println!("{}", qld::version_line());
return Ok(());
}
};
if !options.no_warnings {
for warning in &options.warnings {
diagnostics.emit(Diagnostic::warning(warning.clone()));
}
}
if options.fatal_warnings && !options.warnings.is_empty() {
return Err(qld::Error::Reported {
errors: options.warnings.len(),
});
}
qld::link(&options, diagnostics)
}