yac
/
yacexits
Archived
3
0
Fork 0

added YacError type, returned from rust_main()

This commit is contained in:
Emma Tebibyte 2023-03-28 00:31:00 -04:00
parent d2af983f4a
commit 87abddd277
Signed by: emma
GPG Key ID: 6D661C738815E7DD
4 changed files with 18 additions and 12 deletions

View File

@ -15,6 +15,5 @@ libc-print = "0.1.21"
bindgen = "0.63.0"
[features]
default = [ "entry", "errors"]
default = [ "entry" ]
entry = []
errors = []

View File

@ -31,3 +31,10 @@ impl From<YacError> for (String, u32) {
(err.message, err.code)
}
}
impl From<(String, u32)> for YacError {
fn from(err: (String, u32)) -> Self {
let (message, code) = err;
YacError { message, code }
}
}

View File

@ -1,5 +1,7 @@
mod args;
mod errors;
pub use args::Args;
pub use errors::*;
use crate::{
exit,
@ -34,7 +36,7 @@ pub unsafe fn c_str_to_rust_unchecked(ptr: *const u8) -> &'static str {
}
extern "Rust" {
fn rust_main(args: args::Args) -> Result<u32, (alloc::string::String, u32)>;
fn rust_main(args: args::Args) -> Result<u32, YacError>;
}
#[doc(hidden)]
@ -50,11 +52,11 @@ pub unsafe extern fn main(argc: c_int, argv: *const *const u8) -> c_int {
libc_eprintln!("Unable to ascertain argv[0].");
exit(71);
});
rust_main(args).unwrap_or_else(|(err, code)| {
if code == EX_USAGE {
libc_eprintln!("Usage: {} {}", argv0, err);
} else { libc_eprintln!("{}: {}", argv0, err); }
code
rust_main(args).unwrap_or_else(|err| {
if err.code == EX_USAGE {
libc_eprintln!("Usage: {} {}", argv0, err.message);
} else { libc_eprintln!("{}: {}", argv0, err.message); }
err.code
}) as _
},
Err(_) => {

View File

@ -72,11 +72,9 @@ extern crate core;
#[cfg(feature = "entry")]
mod entry;
#[cfg(feature = "errors")]
mod errors;
pub use entry::Args;
pub use errors::*;
#[cfg(feature = "entry")]
pub use entry::*;
pub fn exit(code: u32) -> ! {
unsafe { libc::exit(code as i32 as libc::c_int); }