diff --git a/cliutils.nim b/cliutils.nim index 02e0c15..31e46a3 100644 --- a/cliutils.nim +++ b/cliutils.nim @@ -1,4 +1,4 @@ -import docopt, json, osproc, posix, nre, streams, strtabs, terminal, unicode +import docopt, json, osproc, posix, nre, streams, strtabs, tables, terminal, unicode import os except sleep import strutils except toUpper, toLower @@ -41,20 +41,20 @@ type HandleProcMsgCB* = proc (outMsg: TaintedString, errMsg: TaintedString, cmd: string): void proc sendMsg*(h: HandleProcMsgCB, outMsg: TaintedString, - errMsg: TaintedString = nil, cmd: string = ""): void = + errMsg: TaintedString = "", cmd: string = ""): void = if h != nil: h(outMsg, errMsg, cmd) proc makeProcMsgHandler*(outSink, errSink: File, prefixCmd: bool = true): HandleProcMsgCB = result = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} = - let prefix = if cmd == nil or not prefixCmd: "" else: cmd & ": " - if outMsg != nil: outSink.writeLine(prefix & outMsg) - if errMsg != nil: errSink.writeLine(prefix & errMsg) + let prefix = if cmd.len == 0 or not prefixCmd: "" else: cmd & ": " + if outMsg.len > 0: outSink.writeLine(prefix & outMsg) + if errMsg.len > 0: errSink.writeLine(prefix & errMsg) proc makeProcMsgHandler*(outSink, errSink: Stream, prefixCmd: bool = true): HandleProcMsgCB = result = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} = - let prefix = if cmd == nil or not prefixCmd: "" else: cmd & ": " - if outMsg != nil: outSink.writeLine(prefix & outMsg) - if errMsg != nil: errSink.writeLine(prefix & errMsg) + let prefix = if cmd.len == 0 or not prefixCmd: "" else: cmd & ": " + if outMsg.len > 0: outSink.writeLine(prefix & outMsg) + if errMsg.len > 0: errSink.writeLine(prefix & errMsg) proc combineProcMsgHandlers*(a, b: HandleProcMsgCB): HandleProcMsgCB = if a == nil: result = b @@ -72,9 +72,9 @@ proc waitFor*(p: Process, msgCB: HandleProcMsgCB, procCmd: string = ""): int = var line = newStringOfCap(120).TaintedString while true: if pout.readLine(line): - msgCB.sendMsg(line, nil, procCmd) + msgCB.sendMsg(line, "", procCmd) elif perr.readLine(line): - msgCB.sendMsg(nil, line, procCmd) + msgCB.sendMsg("", line, procCmd) else: result = peekExitCode(p) if result != -1: break @@ -100,8 +100,8 @@ proc execWithOutput*(command: string, workingDir:string = "", outSeq = @[]; errSeq = @[] var outputCollector = combineProcMsgHandlers(msgCB, proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} = - if outMsg != nil: outSeq.add(outMsg) - if errMsg != nil: errSeq.add(errMsg)) + if outMsg.len > 0: outSeq.add(outMsg) + if errMsg.len > 0: errSeq.add(errMsg)) result[2] = exec(command, workingDir, args, env, options, outputCollector) result[0] = outSeq.join("\n") @@ -147,15 +147,15 @@ proc daemonize*(pidfile, si, so, se: string, daemonMain: proc(): void): Pid = flushFile(stdout) flushFile(stderr) - if not si.isNil and si != "": + if si.len > 0: fi = open(si, fmRead) discard dup2(getFileHandle(fi), getFileHandle(stdin)) - if not so.isNil and so != "": + if so.len > 0: fo = open(so, fmAppend) discard dup2(getFileHandle(fo), getFileHandle(stdout)) - if not se.isNil and so != "": + if se.len > 0: fe = open(se, fmAppend) discard dup2(getFileHandle(fe), getFileHandle(stderr)) @@ -188,6 +188,17 @@ let STRIP_ANSI_REGEX = re"\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]" proc stripAnsi*(str: string): string = return str.replace(STRIP_ANSI_REGEX, "") +proc queryParamsToCliArgs*(queryParams: Table[string, string]): seq[string] = + result = @[] + + for k,v in queryParams: + # support ?arg1=val1&arg2=val2 -> cmd val1 val2 + if k.startsWith("arg"): result.add(v) + + else : + result[1].add("--" & k) + if v != "true": result[1].add(v) # support things like ?verbose=true -> cmd --verbose + proc queryParamsToCliArgs*(queryParams: StringTableRef): seq[string] = result = @[] diff --git a/cliutils.nimble b/cliutils.nimble index 3167505..0427e88 100644 --- a/cliutils.nimble +++ b/cliutils.nimble @@ -1,11 +1,11 @@ # Package -version = "0.5.1" +version = "0.6.2" author = "Jonathan Bernard" description = "Helper functions for writing command line interfaces." license = "MIT" # Dependencies -requires @["nim >= 0.18.0", "docopt"] +requires @["nim >= 0.19.0", "docopt >= 0.6.8"]