1const OPTIONS_TEXT: &str = r"Options:
3 -a, --all all pid (include kernel threads)
4 --sort <order> sort by <order>: rss|swap|total
5 --pid <number> output only selected pid
6 --sleep <number> sleep <number> milli second
7 -l, --cmdline view command line
8
9 -H, --help display this help and exit
10 -V, --version display version information and exit
11 -X <x-options> x options. try -X help
12";
13
14#[repr(u8)]
15#[derive(Debug, PartialEq, Eq)]
16enum CmdOp {
17 All,
18 Sort,
19 Pid,
20 Sleep,
21 Cmdline,
22 Help,
23 Version,
24 UcX,
25}
26
27impl CmdOp {
28 pub const fn to(self) -> OptNum {
29 self as OptNum
30 }
31}
32
33impl std::convert::From<u8> for CmdOp {
34 fn from(value: u8) -> Self {
35 match value {
36 0 => CmdOp::All,
37 1 => CmdOp::Sort,
38 2 => CmdOp::Pid,
39 3 => CmdOp::Sleep,
40 4 => CmdOp::Cmdline,
41 5 => CmdOp::Help,
42 6 => CmdOp::Version,
43 7 => CmdOp::UcX,
44 _ => unreachable!(),
45 }
46 }
47}
48
49#[rustfmt::skip]
50const OPT_ARY: [Opt;8] = [
51 Opt { sho: b'X', lon: "", has: Arg::Yes, num: CmdOp::UcX.to(), },
52 Opt { sho: b'a', lon: "all", has: Arg::No, num: CmdOp::All.to(), },
53 Opt { sho: b'l', lon: "cmdline", has: Arg::No, num: CmdOp::Cmdline.to(), },
54 Opt { sho: b'H', lon: "help", has: Arg::No, num: CmdOp::Help.to(), },
55 Opt { sho: 0u8, lon: "pid", has: Arg::Yes, num: CmdOp::Pid.to(), },
56 Opt { sho: 0u8, lon: "sleep", has: Arg::Yes, num: CmdOp::Sleep.to(), },
57 Opt { sho: 0u8, lon: "sort", has: Arg::Yes, num: CmdOp::Sort.to(), },
58 Opt { sho: b'V', lon: "version", has: Arg::No, num: CmdOp::Version.to(), },
59];
60
61#[rustfmt::skip]
62const OPT_ARY_SHO_IDX: [(u8,usize);5] = [
63(b'H',3),(b'V',7),(b'X',0),(b'a',1),(b'l',2),];
64
65#[derive(Debug, Default, PartialEq, Eq)]
66pub struct CmdOptConf {
67 pub prog_name: String,
68 pub flg_all: bool,
70 pub opt_sort: OptSortOrder,
71 pub opt_pid: i32,
72 pub opt_sleep: u32,
73 pub flg_cmdline: bool,
74 pub flg_help: bool,
75 pub flg_version: bool,
76 pub opt_uc_x: Vec<OptUcXParam>,
77 pub arg_params: Vec<String>,
79}
80
81impl flood_tide::HelpVersion for CmdOptConf {
82 fn is_help(&self) -> bool {
83 self.flg_help
84 }
85 fn is_version(&self) -> bool {
86 self.flg_version
87 }
88}
89
90fn value_to_type<T>(nv: &NameVal<'_>) -> Result<T, OptParseError>
91where
92 T: std::str::FromStr,
93 <T as std::str::FromStr>::Err: std::fmt::Display,
94{
95 match nv.val {
96 Some(x) => match x.parse::<T>() {
97 Ok(d) => Ok(d),
98 Err(err) => Err(OptParseError::invalid_option_argument(
99 &nv.opt.lon_or_sho(),
100 &err.to_string(),
101 )),
102 },
103 None => Err(OptParseError::missing_option_argument(&nv.opt.lon_or_sho())),
104 }
105}