hi, I have been trying to add a spinner animation to my code, but don't know how
proc stream*(client: Chat): string =
let curlCmd = curlCmd(client)
var p = startProcess(command=curlCmd[0], args=curlCmd[1..^1], options={poUsePath})
# [Add spinner animation HERE ]
while not p.outputStream.atEnd:
let line = p.outputStream.readLine()
let (content, cont) = parseLine(line)
if cont:
result.add(content)
stdout.write(content); stdout.flushFile()
p.close(); echo "\n"
I have tried following but failed.
import asyncdispatch
proc stream_async*(client: Chat): string=
let curlCmd = curlCmd(client)
var p = await startProcess(command=curlCmd[0], args=curlCmd[1..^1], options={poUsePath})
var stop_animation = false
proc animate() {.async.} =
let spinner = @["|", "/", "-", "\\"]
var i = 0
while not stop_animation:
stdout.styledWrite(fgCyan, "Loading ", spinner[i mod spinner.len]); stdout.write "\r"; i.inc
await sleepAsync(100)
discard animate()
while true:
stop_animation = true
let line = await p.outputStream.readLine()
let (content, cont) = parseLine(line)
if cont:
result.add(content)
stdout.write(content); stdout.flushFile()
else:
break
p.close(); echo "\n"
import std/strutils
import std/asyncdispatch
import asynctools/asyncpipe
import asynctools/asyncproc
var stop_spinner = false
proc asyncSpinner() {.async.} =
let spinner = @["|", "/", "-", "\\"]
var i = 0
while not stop_spinner:
stdout.write("Loading ", spinner[i mod spinner.len], '\r')
inc i
await sleepAsync(100)
proc asyncHandleProcessOutput() {.async.} =
# For windows: https://github.com/cheatfate/asynctools/pull/52/files
var p = startProcess(command="ping", args=["google.com"], options={poUsePath})
var i = 0;
var buffer = newString(1)
while p.running():
# Read process stdout.
let readCount = await p.outputHandle().readInto(cast[pointer](addr buffer[i]), 1)
# Check line end.
if buffer[i] == '\n':
if buffer.isEmptyOrWhitespace():
# Clear line.
stdout.write("\33[2K\r")
else:
stdout.write(buffer)
# Reset buffer.
i = 0
buffer = newString(1)
else:
i += readCount
buffer.setLen(i + 1)
proc asyncMain() {.async.} =
discard asyncSpinner()
await asyncHandleProcessOutput()
stop_spinner = true
waitFor asyncMain()