1 Commits
0.6.1 ... 0.5.1

Author SHA1 Message Date
969af93425 Bugfix for new HTTP<->CLI functionality. 2018-10-03 03:42:10 -05:00
2 changed files with 19 additions and 30 deletions

View File

@ -1,4 +1,4 @@
import docopt, json, osproc, posix, nre, streams, strtabs, tables, terminal, unicode import docopt, json, osproc, posix, nre, streams, strtabs, terminal, unicode
import os except sleep import os except sleep
import strutils except toUpper, toLower import strutils except toUpper, toLower
@ -41,20 +41,20 @@ type HandleProcMsgCB* = proc (outMsg: TaintedString,
errMsg: TaintedString, cmd: string): void errMsg: TaintedString, cmd: string): void
proc sendMsg*(h: HandleProcMsgCB, outMsg: TaintedString, proc sendMsg*(h: HandleProcMsgCB, outMsg: TaintedString,
errMsg: TaintedString = "", cmd: string = ""): void = errMsg: TaintedString = nil, cmd: string = ""): void =
if h != nil: h(outMsg, errMsg, cmd) if h != nil: h(outMsg, errMsg, cmd)
proc makeProcMsgHandler*(outSink, errSink: File, prefixCmd: bool = true): HandleProcMsgCB = proc makeProcMsgHandler*(outSink, errSink: File, prefixCmd: bool = true): HandleProcMsgCB =
result = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} = result = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} =
let prefix = if cmd.len == 0 or not prefixCmd: "" else: cmd & ": " let prefix = if cmd == nil or not prefixCmd: "" else: cmd & ": "
if outMsg.len > 0: outSink.writeLine(prefix & outMsg) if outMsg != nil: outSink.writeLine(prefix & outMsg)
if errMsg.len > 0: errSink.writeLine(prefix & errMsg) if errMsg != nil: errSink.writeLine(prefix & errMsg)
proc makeProcMsgHandler*(outSink, errSink: Stream, prefixCmd: bool = true): HandleProcMsgCB = proc makeProcMsgHandler*(outSink, errSink: Stream, prefixCmd: bool = true): HandleProcMsgCB =
result = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} = result = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} =
let prefix = if cmd.len == 0 or not prefixCmd: "" else: cmd & ": " let prefix = if cmd == nil or not prefixCmd: "" else: cmd & ": "
if outMsg.len > 0: outSink.writeLine(prefix & outMsg) if outMsg != nil: outSink.writeLine(prefix & outMsg)
if errMsg.len > 0: errSink.writeLine(prefix & errMsg) if errMsg != nil: errSink.writeLine(prefix & errMsg)
proc combineProcMsgHandlers*(a, b: HandleProcMsgCB): HandleProcMsgCB = proc combineProcMsgHandlers*(a, b: HandleProcMsgCB): HandleProcMsgCB =
if a == nil: result = b if a == nil: result = b
@ -72,9 +72,9 @@ proc waitFor*(p: Process, msgCB: HandleProcMsgCB, procCmd: string = ""): int =
var line = newStringOfCap(120).TaintedString var line = newStringOfCap(120).TaintedString
while true: while true:
if pout.readLine(line): if pout.readLine(line):
msgCB.sendMsg(line, "", procCmd) msgCB.sendMsg(line, nil, procCmd)
elif perr.readLine(line): elif perr.readLine(line):
msgCB.sendMsg("", line, procCmd) msgCB.sendMsg(nil, line, procCmd)
else: else:
result = peekExitCode(p) result = peekExitCode(p)
if result != -1: break if result != -1: break
@ -100,8 +100,8 @@ proc execWithOutput*(command: string, workingDir:string = "",
outSeq = @[]; errSeq = @[] outSeq = @[]; errSeq = @[]
var outputCollector = combineProcMsgHandlers(msgCB, var outputCollector = combineProcMsgHandlers(msgCB,
proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} = proc(outMsg, errMsg: TaintedString, cmd: string): void {.closure.} =
if outMsg.len > 0: outSeq.add(outMsg) if outMsg != nil: outSeq.add(outMsg)
if errMsg.len > 0: errSeq.add(errMsg)) if errMsg != nil: errSeq.add(errMsg))
result[2] = exec(command, workingDir, args, env, options, outputCollector) result[2] = exec(command, workingDir, args, env, options, outputCollector)
result[0] = outSeq.join("\n") result[0] = outSeq.join("\n")
@ -147,15 +147,15 @@ proc daemonize*(pidfile, si, so, se: string, daemonMain: proc(): void): Pid =
flushFile(stdout) flushFile(stdout)
flushFile(stderr) flushFile(stderr)
if si.len > 0: if not si.isNil and si != "":
fi = open(si, fmRead) fi = open(si, fmRead)
discard dup2(getFileHandle(fi), getFileHandle(stdin)) discard dup2(getFileHandle(fi), getFileHandle(stdin))
if so.len > 0: if not so.isNil and so != "":
fo = open(so, fmAppend) fo = open(so, fmAppend)
discard dup2(getFileHandle(fo), getFileHandle(stdout)) discard dup2(getFileHandle(fo), getFileHandle(stdout))
if se.len > 0: if not se.isNil and so != "":
fe = open(se, fmAppend) fe = open(se, fmAppend)
discard dup2(getFileHandle(fe), getFileHandle(stderr)) discard dup2(getFileHandle(fe), getFileHandle(stderr))
@ -188,17 +188,6 @@ 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 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] = proc queryParamsToCliArgs*(queryParams: StringTableRef): seq[string] =
result = @[] result = @[]
@ -207,5 +196,5 @@ proc queryParamsToCliArgs*(queryParams: StringTableRef): seq[string] =
if k.startsWith("arg"): result.add(v) if k.startsWith("arg"): result.add(v)
else : else :
result[1].add("--" & k) result.add("--" & k)
if v != "true": result[1].add(v) # support things like ?verbose=true -> cmd --verbose if v != "true": result.add(v) # support things like ?verbose=true -> cmd --verbose

View File

@ -1,11 +1,11 @@
# Package # Package
version = "0.6.1" version = "0.5.1"
author = "Jonathan Bernard" author = "Jonathan Bernard"
description = "Helper functions for writing command line interfaces." description = "Helper functions for writing command line interfaces."
license = "MIT" license = "MIT"
# Dependencies # Dependencies
requires @["nim >= 0.19.0", "docopt >= 0.6.8"] requires @["nim >= 0.18.0", "docopt"]