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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use bpaf::*;
#[derive(Clone, Debug)]
#[allow(dead_code)]
enum Segment {
Time(f64),
SpeedDistance { speed: f64, dist: f64 },
}
fn main() {
let mph = long("mph")
.help("speed in MPH")
.argument("SPEED")
.from_str::<f64>()
.map(|x| x * 1.6);
let kph = long("kph")
.help("Speed in KPH")
.argument("SPEED")
.from_str::<f64>();
let speed = construct!([mph, kph]);
let km = long("km")
.help("Distance in KM")
.argument("KMs")
.from_str::<f64>();
let mi = long("mi")
.help("distance in miles")
.argument("MILES")
.from_str::<f64>()
.map(|x| x * 1.6);
let dist = construct!([mi, km]);
let time = long("time")
.help("Travel time in hours")
.argument("TIME")
.from_str::<f64>();
let segment_time = time.map(Segment::Time);
let segment_speed = construct!(Segment::SpeedDistance { speed, dist });
let segment = construct!([segment_speed, segment_time]);
let parser = segment
.many()
.guard(|x| !x.is_empty(), "need at least one segment")
.guard(
|x| x.len() < 10,
"for more than 9 segments you need to purchase a premium subscription",
);
let descr = "Accepts one or more travel segments";
let header = "You need to specify one or more travel segments, segment is defined by
a pair of speed and distance or by time.
This example defines two separate travel segments, one given by speed/distance combo and one by time
travel --km 180 --kph 35 --time";
let decorated = parser.to_options().descr(descr).header(header);
let opt = decorated.run();
println!("{:#?}", opt);
}