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 }