usage/
usage.rs

1use std::collections::HashMap;
2
3use qargparser as arg;
4
5#[derive(Default, Debug)]
6struct MyContext {
7  do_help: bool,
8  do_version: bool,
9  verbosity: u8,
10  fname: String,
11  params: HashMap<String, String>,
12  cmd: String,
13  subcmd: String,
14  tophelp: bool,
15  bottomhelp: bool
16}
17
18
19fn main() -> Result<(), Box<dyn std::error::Error>> {
20  let help_spec = arg::Builder::new()
21    .sopt('h')
22    .lopt("help")
23    .exit(true)
24    .help(&["Show this help."])
25    .build(|_spec, ctx: &mut MyContext, _args| {
26      ctx.do_help = true;
27    });
28  let version_spec = arg::Builder::new()
29    .sopt('V')
30    .lopt("version")
31    .exit(true)
32    .help(&["Output tool version and exit."])
33    .build(
34      |_spec: &arg::Spec<MyContext>,
35       ctx: &mut MyContext,
36       _args: &Vec<String>| ctx.do_version = true
37    );
38  let tophelp_spec = arg::Builder::new()
39    .sopt('t')
40    .lopt("tophelp")
41    .help(&["Show top help."])
42    .build(|_spec, ctx: &mut MyContext, _args| {
43      ctx.tophelp = true;
44    });
45  let bottomhelp_spec = arg::Builder::new()
46    .sopt('b')
47    .lopt("bottomhelp")
48    .help(&["Show bottom help."])
49    .build(|_spec, ctx: &mut MyContext, _args| {
50      ctx.bottomhelp = true;
51    });
52
53  let ctx = MyContext {
54    ..Default::default()
55  };
56  let mut prsr = arg::Parser::from_env(ctx);
57
58  prsr.add(help_spec)?;
59  prsr.add(version_spec)?;
60  prsr.add(tophelp_spec)?;
61  prsr.add(bottomhelp_spec)?;
62
63  prsr.parse()?;
64
65  if prsr.get_ctx().do_help == true {
66    prsr.usage(&mut std::io::stdout());
67    std::process::exit(0);
68  }
69
70  if prsr.get_ctx().do_version == true {
71    const VERSION: &'static str = env!("CARGO_PKG_VERSION");
72    println!("usage {}", VERSION);
73    std::process::exit(0);
74  }
75
76  let ctx = prsr.into_ctx();
77
78  println!("{:?}", &ctx);
79
80  usage_test(ctx)?;
81
82  Ok(())
83}
84
85
86fn usage_test(ctx: MyContext) -> Result<(), Box<dyn std::error::Error>> {
87  let help_spec = arg::Builder::new()
88    .sopt('h')
89    .lopt("help")
90    .exit(true)
91    .help(&["Show this help."])
92    .build(|_spec, ctx: &mut MyContext, _args| {
93      ctx.do_help = true;
94    });
95  let version_spec = arg::Builder::new()
96    .sopt('V')
97    .lopt("version")
98    .exit(true)
99    .help(&["Output tool version and exit."])
100    .build(
101      |_spec: &arg::Spec<MyContext>,
102       ctx: &mut MyContext,
103       _args: &Vec<String>| ctx.do_version = true
104    );
105  let file_spec = arg::Builder::new()
106    .sopt('f')
107    .lopt("file")
108    .help(&["Use data in FILE."])
109    .nargs(arg::Nargs::Count(1), &["FILE"])
110    .build(|_spec, ctx: &mut MyContext, args| {
111      ctx.fname = args[0].clone();
112    });
113  let param_spec = arg::Builder::new()
114    .sopt('p')
115    .lopt("param")
116    .help(&["Add a key/value parameter field. The key must be unique."])
117    .nargs(arg::Nargs::Count(2), &["KEY", "VALUE"])
118    .build(|_spec, ctx: &mut MyContext, args| {
119      ctx.params.insert(args[0].clone(), args[1].clone());
120    });
121  let cmd_spec = arg::Builder::new()
122    .name("command")
123    .required(true)
124    .nargs(arg::Nargs::Count(1), &["COMMAND"])
125    .help(&["The command to run."])
126    .build(|_spec, ctx: &mut MyContext, args| {
127      ctx.cmd = args[0].clone();
128    });
129  let subcmd_spec = arg::Builder::new()
130    .name("subcmd")
131    .nargs(arg::Nargs::Count(1), &["SUBCMD"])
132    .help(&["Command-specific sub-command."])
133    .build(|_spec, ctx: &mut MyContext, args| {
134      ctx.subcmd = args[0].clone();
135    });
136
137  let ctx2 = MyContext {
138    ..Default::default()
139  };
140  let mut prsr = arg::Parser::from_args("hello", &["--help"], ctx2);
141
142  if ctx.tophelp {
143    prsr.set_tophelp(&[
144      "\"You know,\" said Arthur, \"it's at times like this, when I'm \
145       trapped in a Vogon airlock with a man from Betelgeuse, and about to \
146       die of asphyxiation in deep space that I really wish I'd listened to \
147       what my mother told me when I was young.\"",
148      "\"Why, what did she tell you?\"",
149      "\"I don't know, I didn't listen.\""
150    ]);
151  }
152  if ctx.bottomhelp {
153    prsr.set_bottomhelp(&[
154      "\"So this is it,\" said Arthur, \"We are going to die.\"",
155      "\"Yes,\" said Ford, \"except... no! Wait a minute!\" He suddenly \
156       lunged across the chamber at something behind Arthur's line of \
157       vision. \"What's this switch?\" he cried.",
158      "\"What? Where?\" cried Arthur, twisting round.",
159      "\"No, I was only fooling,\" said Ford, \"we are going to die after \
160       all.\""
161    ]);
162  }
163
164  prsr.add(help_spec)?;
165  prsr.add(version_spec)?;
166  prsr.add(file_spec)?;
167  prsr.add(param_spec)?;
168  prsr.add(cmd_spec)?;
169  prsr.add(subcmd_spec)?;
170
171  prsr.parse()?;
172
173  if prsr.get_ctx().do_help == true {
174    prsr.usage(&mut std::io::stdout());
175    std::process::exit(0);
176  }
177
178  let ctx = prsr.into_ctx();
179
180  println!("{:?}", &ctx);
181
182  Ok(())
183}
184
185// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :