import std / [osproc, os, net, strformat, with, paths, exitprocs]
const
EndToken = "\e"
PauseToken = "\e\e"
ClearToken = "\e\e\e"
Port = Port 6000
var
commands: Channel[string]
results: Channel[string]
commands.open()
results.open()
proc processTask(task: string) =
let socket = newSocket()
for i in 0..9:
socket.connect("localhost", Port) # Connection refused [OSError]
socket.send(&"{task}\c\l")
discard "do stuff here..."
socket.close()
results.send(EndToken)
proc suggestThread() {.thread.} =
while true:
let cmd = commands.recv()
case cmd
of EndToken: break
of PauseToken: os.sleep(300)
else: processTask(cmd)
var prevProject: string
var nimsuggest: Process
proc shutdown() {.noconv.} =
if nimsuggest.isNil: return
nimsuggest.terminate()
nimsuggest.close()
nimsuggest = nil
proc startup(project: string; debug: bool): bool =
if nimsuggest.isNil or project != prevProject or not nimsuggest.running:
let pathToExe = Path findExe("nimsuggest")
assert pathToExe.string.len != 0
prevProject = project
shutdown()
let nimPath = findExe("nim").splitFile.dir.parentDir
var args = if debug: @["--debug"] else: @[]
with args:
add fmt"--port:{Port}"
add "--v2"
add project
add "--log"
add "--debug"
nimsuggest = startProcess(pathToExe.string, nimPath, args,
options = {poStdErrToStdOut, poInteractive,
poDaemon})
# give it some time to startup:
commands.send(PauseToken)
return nimsuggest != nil
var processing: bool
proc requestSuggestion(filename, cmd: string; col, currentLine: int) =
commands.send &"{cmd} \"{filename}\":{currentLine+1}:{col}\c\l"
processing = true
var backgroundThread: Thread[void]
createThread[void](backgroundThread, suggestThread)
proc main() =
assert startup("myTestProject.nim", true)
addExitProc shutdown
while true:
requestSuggestion("myTestProject.nim", "con", 5, 10)
os.sleep(50)
main()
on ubuntu:
../.choosenim/toolchains/nim-2.0.0/lib/system.nim(35) suggestThread
../Documents/nimsuggestTest/nimsuggestTest.nim(19) processTask
../.choosenim/toolchains/nim-2.0.0/lib/pure/net.nim(2068) connect
../.choosenim/toolchains/nim-2.0.0/lib/std/oserrors.nim(92) raiseOSError
Error: unhandled exception: Connection refused [OSError]
on windows:
../.choosenim/toolchains/nim-2.0.0/lib/system.nim(35) suggestThread
../Documents/nimsuggestTest/nimsuggestTest.nim(19) processTask
../.choosenim/toolchains/nim-2.0.0/lib/pure/net.nim(2068) connect
../.choosenim/toolchains/nim-2.0.0/lib/std/oserrors.nim(92) raiseOSError
Error: unhandled exception: No connection could be made because the target machine actively refused it. [OSError]