diff --git a/fish-rust/src/builtins/shared.rs b/fish-rust/src/builtins/shared.rs index 664c5a871..a6e05454d 100644 --- a/fish-rust/src/builtins/shared.rs +++ b/fish-rust/src/builtins/shared.rs @@ -23,7 +23,8 @@ fn rust_run_builtin( streams: Pin<&mut io_streams_t>, cpp_args: &Vec, builtin: RustBuiltin, - ); + status_code: &mut i32, + ) -> bool; } impl Vec {} @@ -79,7 +80,8 @@ fn rust_run_builtin( streams: Pin<&mut builtins_ffi::io_streams_t>, cpp_args: &Vec, builtin: RustBuiltin, -) { + status_code: &mut i32, +) -> bool { let mut storage = Vec::::new(); for arg in cpp_args { storage.push(arg.into()); @@ -89,7 +91,14 @@ fn rust_run_builtin( args.push(arg.as_utfstr()); } let streams = &mut io_streams_t::new(streams); - run_builtin(parser.unpin(), streams, args.as_mut_slice(), builtin); + + match run_builtin(parser.unpin(), streams, args.as_mut_slice(), builtin) { + None => false, + Some(status) => { + *status_code = status; + true + } + } } pub fn run_builtin( diff --git a/src/builtin.cpp b/src/builtin.cpp index 4679df0c3..4f8fa7b6c 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -535,12 +535,18 @@ static maybe_t try_get_rust_builtin(const wcstring &cmd) { return none(); } -static proc_status_t builtin_run_rust(parser_t &parser, io_streams_t &streams, - const wcstring_list_t &argv, RustBuiltin builtin) { +static maybe_t builtin_run_rust(parser_t &parser, io_streams_t &streams, + const wcstring_list_t &argv, RustBuiltin builtin) { ::rust::Vec rust_argv; for (const wcstring &arg : argv) { rust_argv.emplace_back(arg.c_str()); } - rust_run_builtin(parser, streams, rust_argv, builtin); - return none(); + + int status_code; + bool update_status = rust_run_builtin(parser, streams, rust_argv, builtin, status_code); + if (update_status) { + return status_code; + } else { + return none(); + } }