diff options
author | Grzegorz Adam Hankiewicz <gradha@imap.cc> | 2012-10-19 18:46:30 +0200 |
---|---|---|
committer | Grzegorz Adam Hankiewicz <gradha@imap.cc> | 2012-10-19 20:09:12 +0200 |
commit | 760e42b3f9eeda27d309391ef4a898dd3ea5fcc9 (patch) | |
tree | fa8908d66744e1e131ea76023b1c9c2cdc127342 /examples | |
parent | d20a8ac68d2c398a9a0e9d6f055fc2f1c07bdefe (diff) | |
download | Nim-760e42b3f9eeda27d309391ef4a898dd3ea5fcc9.tar.gz |
Adds command line interface for backend addition.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/cross_calculator/nimrod_commandline/nimcalculator.nim | 110 | ||||
-rw-r--r-- | examples/cross_calculator/nimrod_commandline/readme.txt | 9 |
2 files changed, 119 insertions, 0 deletions
diff --git a/examples/cross_calculator/nimrod_commandline/nimcalculator.nim b/examples/cross_calculator/nimrod_commandline/nimcalculator.nim new file mode 100644 index 000000000..1fc62fa87 --- /dev/null +++ b/examples/cross_calculator/nimrod_commandline/nimcalculator.nim @@ -0,0 +1,110 @@ +# Implements a command line interface against the backend. + +import backend +import parseopt +import strutils + +const + USAGE = """nimcalculator - Nimrod cross platform calculator + (beta version, only integer addition is supported!) + +Usage: + nimcalculator [options] [-a=value -b=value] +Options: + -a=value sets the integer value of the a parameter + -b=value sets the integer value of the b parameter + -h, --help shows this help + +If no options are used, an interactive mode is entered. +""" + +type + TAction = enum # The possible types of operation + rtParams, # Two valid parameters were provided + rtInteractive # No parameters were provided, run interactive mode + + TParamConfig = object of TObject + action: TAction # store the type of operation + paramA, paramB: int # possibly store the valid parameters + + +proc parseCmdLine(): TParamConfig = + ## Parses the commandline. + ## + ## Returns a TParamConfig structure filled with the proper values or directly + ## calls quit() with the appropriate error message. + var + hasA = false + hasB = false + p = initOptParser() + key, val : TaintedString + + result.action = rtInteractive # By default presume interactive mode. + try: + while true: + next(p) + key = p.key + val = p.val + + case p.kind + of cmdArgument: + stdout.write(USAGE) + quit("Erroneous argument detected: " & key, 1) + of cmdLongOption, cmdShortOption: + case normalize(key) + of "help", "h": + stdout.write(USAGE) + quit(0) + of "a": + result.paramA = val.parseInt + hasA = true + of "b": + result.paramB = val.parseInt + hasB = true + else: + stdout.write(USAGE) + quit("Unexpected option: " & key, 2) + of cmdEnd: break + except EInvalidValue: + stdout.write(USAGE) + quit("Invalid value " & val & " for parameter " & key, 3) + + if hasA and hasB: + result.action = rtParams + elif hasA or hasB: + stdout.write(USAGE) + quit("Error: provide both A and B to operate in param mode", 4) + + +proc parseUserInput(question: string): int = + ## Parses a line of user input, showing question to the user first. + ## + ## If the user input is an empty line quit() is called. Returns the value + ## parsed as an integer. + while true: + echo(question) + let input = stdin.readLine + try: + result = input.parseInt + break + except EInvalidValue: + if input.len < 1: quit("Blank line detected, quitting.", 0) + echo("Sorry, `$1' doesn't seem to be a valid integer" % input) + +proc interactiveMode() = + ## Asks the user for two integer values, adds them and exits. + let paramA = parseUserInput("Enter the first parameter (blank to exit):") + let paramB = parseUserInput("Enter the second parameter (blank to exit):") + echo("Calculating... $1 + $2 = $3" % [$paramA, $paramB, + $backend.myAdd(paramA, paramB)]) + + +when isMainModule: + ## Main entry point. + let opt = parseCmdLine() + if rtParams == opt.action: + echo("Param mode: $1 + $2 = $3" % [$opt.paramA, $opt.paramB, + $backend.myAdd(opt.paramA, opt.paramB)]) + else: + echo("Entering interactive addition mode") + interactiveMode() diff --git a/examples/cross_calculator/nimrod_commandline/readme.txt b/examples/cross_calculator/nimrod_commandline/readme.txt new file mode 100644 index 000000000..45c1a30af --- /dev/null +++ b/examples/cross_calculator/nimrod_commandline/readme.txt @@ -0,0 +1,9 @@ +In this directory you will find the nimrod commandline version of the +cross-calculator sample. + +The commandline interface can be used non interactively through switches, or +interactively when running the command without parameters. + +Compilation is fairly easy, just include the path to the backend in your +compilation command. A basic build.sh is provided for unix like platforms with +the correct parameters. |