fn error_display_chain(error: &dyn std::error::Error) -> String {
let mut s = error.to_string();
if let Some(source) = error.source() {
s.push_str(" -> ");
s.push_str(&error_display_chain(source));
}
s
}
#[doc(hidden)]
pub fn run<R, E>(arg_str: &str, run_fn: R) -> u32
where
E: AsRef<dyn std::error::Error>,
R: FnOnce(&[String]) -> Result<(), E>,
{
crate::init();
let args = if arg_str.is_empty() {
vec![]
} else {
arg_str
.split(' ')
.map(|s| s.to_owned())
.collect::<Vec<String>>()
};
match run_fn(&args) {
Ok(_) => 0,
Err(err) => {
let _ = ark_api::core::return_slice(error_display_chain(err.as_ref()).as_bytes());
1
}
}
}
#[doc(hidden)]
#[cfg(feature = "with_async")]
pub fn async_run<R, F, E>(arg_str: &str, run_fn: R) -> u32
where
E: AsRef<dyn std::error::Error>,
F: std::future::Future<Output = Result<(), E>>,
R: FnOnce(Vec<String>) -> F,
{
crate::init();
let args = if arg_str.is_empty() {
vec![]
} else {
arg_str
.split(' ')
.map(|s| s.to_owned())
.collect::<Vec<String>>()
};
let mut rt = crate::Runtime::new();
let f = run_fn(args);
match rt.block_on(f) {
Ok(_) => 0,
Err(err) => {
let _ = ark_api::core::return_slice(error_display_chain(err.as_ref()).as_bytes());
1
}
}
}
#[macro_export(local_inner_macros)]
macro_rules! impl_blocking_cmdlet {
($run_fn:ident, $help_fn:ident) => {
#[no_mangle]
unsafe fn ark_cmdlet_run(arg_str_ptr: *const u8, arg_str_size: u32) -> u32 {
let arg_str = unsafe { $crate::util::param_str(arg_str_ptr, arg_str_size) };
ark_module::cmdlet::run(arg_str, $run_fn)
}
#[no_mangle]
fn ark_cmdlet_help() {
ark::core::return_slice($help_fn().as_bytes());
}
};
}
#[cfg(feature = "with_async")]
#[macro_export(local_inner_macros)]
macro_rules! impl_async_cmdlet {
($run_fn:ident, $help_fn:ident) => {
#[no_mangle]
unsafe fn ark_cmdlet_run(arg_str_ptr: *const u8, arg_str_size: u32) -> u32 {
let arg_str = unsafe { $crate::util::param_str(arg_str_ptr, arg_str_size) };
ark_module::cmdlet::async_run(arg_str, $run_fn)
}
#[no_mangle]
fn ark_cmdlet_help() {
ark::core::return_slice($help_fn().as_bytes());
}
};
}
#[macro_export(local_inner_macros)]
macro_rules! impl_wasi_cmdlet {
($help_fn:ident) => {
#[no_mangle]
fn ark_wasi_cmdlet_help() {
ark::core::return_slice($help_fn().as_bytes());
}
};
}