1use bpaf::*;
8
9#[derive(Clone, Debug)]
10#[allow(dead_code)]
11enum Segment {
12 Time(f64),
13 SpeedDistance { speed: f64, dist: f64 },
14}
15
16fn main() {
17 let mph = long("mph")
23 .help("speed in MPH")
24 .argument::<f64>("SPEED")
25 .map(|x| x * 1.6);
26 let kph = long("kph").help("Speed in KPH").argument::<f64>("SPEED");
27
28 let speed = construct!([mph, kph]);
30
31 let km = long("km").help("Distance in KM").argument::<f64>("KMs");
33 let mi = long("mi")
34 .help("distance in miles")
35 .argument::<f64>("MILES")
36 .map(|x| x * 1.6);
37 let dist = construct!([mi, km]);
38
39 let time = long("time")
41 .help("Travel time in hours")
42 .argument::<f64>("TIME");
43
44 let segment_time = time.map(Segment::Time);
46
47 let segment_speed = construct!(Segment::SpeedDistance { speed, dist });
49
50 let segment = construct!([segment_speed, segment_time]);
52
53 let parser = segment
55 .many()
56 .guard(|x| !x.is_empty(), "need at least one segment")
57 .guard(
58 |x| x.len() < 10,
59 "for more than 9 segments you need to purchase a premium subscription",
60 );
61
62 let descr = "Accepts one or more travel segments";
63 let header = "You need to specify one or more travel segments, segment is defined by
64a pair of speed and distance or by time.
65
66This example defines two separate travel segments, one given by speed/distance combo and one by time
67 travel --km 180 --kph 35 --time";
68 let decorated = parser.to_options().descr(descr).header(header);
69
70 let opt = decorated.run();
75
76 println!("{:#?}", opt);
77}