1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use clap::Parser;
use rustutils_runnable::Runnable;
use std::error::Error;
use std::process::ExitCode;
mod macros;
macros::declare_utility! {
"arch" => rustutils_arch::Arch as Arch,
"cat" => rustutils_cat::Cat as Cat,
"false" => rustutils_false::False as False,
"pwd" => rustutils_pwd::Pwd as Pwd,
"rmdir" => rustutils_rmdir::Rmdir as Rmdir,
"seq" => rustutils_seq::Seq as Seq,
"sleep" => rustutils_sleep::Sleep as Sleep,
"tee" => rustutils_tee::Tee as Tee,
"true" => rustutils_true::True as True,
"uname" => rustutils_uname::Uname as Uname,
"unlink" => rustutils_unlink::Unlink as Unlink,
"wc" => rustutils_wc::Wc as Wc,
"yes" => rustutils_yes::Yes as Yes,
"dirname" => rustutils_dirname::Dirname as Dirname,
"basename" => rustutils_basename::Basename as Basename,
"mkdir" => rustutils_mkdir::Mkdir as Mkdir,
"env" => rustutils_env::Env as Env,
"printenv" => rustutils_printenv::Printenv as Printenv,
"base64" => rustutils_base64::Base64 as Base64
}
#[derive(Parser, Clone, Debug)]
#[clap(author, version, about, long_about = None)]
pub struct Coreutils {
#[clap(subcommand)]
util: Coreutil,
}
impl Runnable for Coreutils {
fn run(&self) -> Result<(), Box<dyn Error>> {
self.util.runnable().run()
}
fn main(&self) -> ExitCode {
self.util.runnable().main()
}
}
pub fn multicall_parse() -> Result<Option<Coreutil>, Box<dyn Error>> {
let executable = std::env::current_exe()?;
let file = executable.file_stem().and_then(|s| s.to_str());
let result = file.and_then(|name| Coreutil::parse(name));
Ok(result)
}
pub fn main() -> ExitCode {
if cfg!(feature = "multicall") {
match multicall_parse() {
Ok(Some(utility)) => utility.runnable().main(),
Ok(None) => Coreutils::parse().main(),
Err(error) => {
eprintln!("Error parsing multicall: {error}");
ExitCode::FAILURE
}
}
} else {
Coreutils::parse().main()
}
}