summary refs log tree commit diff stats
path: root/examples
diff options
context:
space:
mode:
authorGrzegorz Adam Hankiewicz <gradha@imap.cc>2012-10-19 18:46:30 +0200
committerGrzegorz Adam Hankiewicz <gradha@imap.cc>2012-10-19 20:09:12 +0200
commit760e42b3f9eeda27d309391ef4a898dd3ea5fcc9 (patch)
treefa8908d66744e1e131ea76023b1c9c2cdc127342 /examples
parentd20a8ac68d2c398a9a0e9d6f055fc2f1c07bdefe (diff)
downloadNim-760e42b3f9eeda27d309391ef4a898dd3ea5fcc9.tar.gz
Adds command line interface for backend addition.
Diffstat (limited to 'examples')
-rw-r--r--examples/cross_calculator/nimrod_commandline/nimcalculator.nim110
-rw-r--r--examples/cross_calculator/nimrod_commandline/readme.txt9
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.