1 module examples.calc;
2 
3 import cmdline;
4 import std.stdio;
5 
6 // void main(in string[] argv) {
7 //     program.name("calc");
8 //     program.description("simple calculator for baisc binary computation");
9 //     program.aliasName("cal");
10 //     program.setVersion("1.0.1");
11 
12 //     Argument arg_first = createArgument!double("first");
13 //     Argument arg_second = createArgument!double("second");
14 //     arg_first.rangeOf(0.0, 1024.0);
15 //     arg_second.rangeOf(0.0, 1024.0);
16 //     program.addArgument(arg_first);
17 //     program.addArgument(arg_second);
18 //     program.argumentDesc([
19 //         "first": "the first operand",
20 //         "second": "the second operaand"
21 //     ]);
22 //     program.addHelpText(AddHelpPos.After, `
23 // Examples:
24 //     $ calc 12 13
25 //     $ calc 23 45 -o
26 //     $ calc 23.3 45 -o -
27 //     $ calc 23.3 27.3 -o /
28 //     $ calc -o 23.3 45
29 //     $ calc -o * 23.3 45
30 //     `);
31 //     Option op_opt = createOption!string("-o, --operator [op]", "the operator of two double number");
32 //     op_opt.choices("+", "-", "*", "/");
33 //     op_opt.preset("*");
34 //     op_opt.defaultVal("+");
35 //     program.addOption(op_opt);
36 
37 //     program.action((opts, _first, _second) {
38 //         double first = cast(double) _first;
39 //         double second = cast(double) _second;
40 //         string op = opts("operator").get!string;
41 //         switch (op) {
42 //         case "+":
43 //             writefln("%4.4f %s %4.4f = %4.4f", first, op, second, first + second);
44 //             break;
45 //         case "-":
46 //             writefln("%4.4f %s %4.4f = %4.4f", first, op, second, first - second);
47 //             break;
48 //         case "*":
49 //             writefln("%4.4f %s %4.4f = %4.4f", first, op, second, first * second);
50 //             break;
51 //         default:
52 //             writefln("%4.4f %s %4.4f = %4.4f", first, op, second, first / second);
53 //             break;
54 //         }
55 //     });
56 
57 //     program.parse(argv);
58 // }
59 
60 struct CalcResult {
61     mixin BEGIN;
62     mixin DESC!"simple calculator for baisc binary computation";
63     mixin VERSION!"1.0.1";
64 
65     mixin SHOW_HELP_AFTER_ERR;
66     mixin DISALLOW_EXCESS_ARGS;
67 
68     mixin DEF_OPT!(
69         "operator", string, "-o [op]",
70         Desc_d!"the operator of two double number",
71         Choices_d!("add", "sub", "multi", "div"),
72         Preset_d!"multi",
73         Default_d!"add",
74         ToArg_d,
75     );
76 
77     mixin DEF_OPT!(
78         "first", double, "-f <fnum>",
79         Desc_d!"the first operand",
80         Range_d!(0.0, 1024.0),
81         Default_d!0.0,
82         ToArg_d,
83     );
84 
85     mixin DEF_OPT!(
86         "second", double, "-s <snum>",
87         Desc_d!"the second operand",
88         Range_d!(0.0, 1024.0),
89         Default_d!1.0,
90         ToArg_d,
91     );
92 
93     mixin END;
94 
95     void action() {
96         auto f = first.get;
97         auto s = second.get;
98         auto op = operator.get;
99         auto op_map = [
100             "add": "+",
101             "sub": "-",
102             "multi": "*",
103             "div": "/"
104         ];
105         switch (op) {
106         case "add":
107             writefln("%4.4f %s %4.4f = %4.4f", f, op_map[op], s, f + s);
108             break;
109         case "sub":
110             writefln("%4.4f %s %4.4f = %4.4f", f, op_map[op], s, f - s);
111             break;
112         case "multi":
113             writefln("%4.4f %s %4.4f = %4.4f", f, op_map[op], s, f * s);
114             break;
115         case "div":
116             writefln("%4.4f %s %4.4f = %4.4f", f, op_map[op], s, f / s);
117             break;
118         default:
119             break;
120         }
121     }
122 }
123 
124 void main(in string[] argv) {
125     argv.run!CalcResult;
126 }