Rustlike shell scripting language (WIP) -> use rust_cmd_lib instead.
Resilient & robust shell script, compiling to rust code/bash script
$ cargo build
rust-shell-script$:~/rust-shell-script$ cat examples/hello.rss cmd error_command() { do_something_failed } fun bad_greeting(name) { info "Running error_command ..." error_command output "hello, ${name}!" } fun good_greeting(name) { info "Running good_command ..." output "hello, ${name}!" } cmd main() { let bad_ans = $(bad_greeting "rust-shell-script") info "${bad_ans}" let good_ans = $(good_greeting "rust-shell-script") info "${good_ans}" return 0 }
rust-shell-script:~/rust-shell-script$ target/debug/rust-shell-script -t bash examples/hello.rss
Generating bash script to examples/hello.sh ...rust-shell-script:~/rust-shell-script$ shellcheck examples/hello.sh rust-shell-script:~/rust-shell-script$ echo $? 0
#!/bin/bash # # Generated by rust-shell-script # . "${RUNTIME:-.}/cmd_lib.sh" error_command() { do_something_failed } function bad_greeting() { local name="$1" info "Running error_command ..." error_command output "hello, ${name}!" } function good_greeting() { local name="$1" info "Running good_command ..." output "hello, ${name}!" } main() { local bad_ans bad_ans=$(_call bad_greeting "rust-shell-script") info "${bad_ans}" local good_ans good_ans=$(_call good_greeting "rust-shell-script") info "${good_ans}" return 0 } main "$@"
All command errors will be captured automatically, even within bash function:
rust-shell-script:~/rust-shell-script/examples$ ./hello.sh Running error_command ... /bin/bash: line 219: do_something_failed: command not found FATAL: Running command (bad_ans=$(_call bad_greeting "rust-shell-script")) near script hello.sh:main():1 failed (ret=127)
tao@sophia:~/rust-shell-script$ target/debug/rust-shell-script -t rust examples/hello.rss
Generating rust code to examples/hello.rs ...// Generated by rust-shell-script mod cmd_lib; use crate::cmd_lib::{CmdResult, FunResult}; fn error_command() -> CmdResult { run_cmd!("do_something_failed") } fn bad_greeting(name: &str) -> FunResult { info!("Running error_command ..."); error_command()?; output!("hello, {}!", name) } fn good_greeting(name: &str) -> FunResult { info!("Running good_command ..."); output!("hello, {}!", name) } fn main() -> CmdResult { let bad_ans = bad_greeting("rust-shell-script")?;; info!("{}", bad_ans); let good_ans = good_greeting("rust-shell-script")?;; info!("{}", good_ans); return Ok(()) }
rust-shell-script:~/rust-shell-script/examples$ rustc hello.rs rust-shell-script:~/rust-shell-script/examples$ ./hello Running error_command ... Running ["do_something_failed"] ... Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }