mirror of
https://github.com/daylinmorgan/oizys.git
synced 2024-11-09 08:13:14 -06:00
bbansi was consumed by hwylterm
This commit is contained in:
parent
82cbff556e
commit
91dc727259
11 changed files with 34 additions and 185 deletions
|
@ -6,3 +6,5 @@ task build, "build oizys":
|
|||
when withDir(thisDir(), system.fileExists("nimble.paths")):
|
||||
include "nimble.paths"
|
||||
# end Nimble config
|
||||
#
|
||||
--path:"../../../dev/github/daylinmorgan/hwylterm/src"
|
||||
|
|
|
@ -8,5 +8,5 @@ buildNimblePackage {
|
|||
verions = "unstable";
|
||||
src = lib.cleanSource ./.;
|
||||
nativeBuildInputs = [ openssl ];
|
||||
nimbleDepsHash = "sha256-WeTbNoF+TuzWriqoHWk5DBVgBXtNBIBHMkwy8/+a2JA=";
|
||||
nimbleDepsHash = "sha256-o+CN0LlVOcgjLpDfjItW/5GCXTWcPSx9GfwQn+u2ST4=";
|
||||
}
|
||||
|
|
|
@ -1,16 +1,6 @@
|
|||
{
|
||||
"version": 2,
|
||||
"packages": {
|
||||
"bbansi": {
|
||||
"version": "0.1.1",
|
||||
"vcsRevision": "9a85d9ed028f06f1ed1ee6851480a51408a6004e",
|
||||
"url": "https://github.com/daylinmorgan/bbansi",
|
||||
"downloadMethod": "git",
|
||||
"dependencies": [],
|
||||
"checksums": {
|
||||
"sha1": "b338433f9a7a1b788b7583674c2b14096ced29ee"
|
||||
}
|
||||
},
|
||||
"cligen": {
|
||||
"version": "1.7.0",
|
||||
"vcsRevision": "4193f802796f15559c81c6dd56724d6f20345917",
|
||||
|
@ -21,6 +11,16 @@
|
|||
"sha1": "300bd7fdb6e48d2d98e34ed0661206b50331e99c"
|
||||
}
|
||||
},
|
||||
"hwylterm": {
|
||||
"version": "0.1.0",
|
||||
"vcsRevision": "9afc339a9791f25010ea89a4f52204ad8eeda858",
|
||||
"url": "https://github.com/daylinmorgan/hwylterm",
|
||||
"downloadMethod": "git",
|
||||
"dependencies": [],
|
||||
"checksums": {
|
||||
"sha1": "853c67ee7f789d825ec6f46c9fbae68e03e43cdb"
|
||||
}
|
||||
},
|
||||
"jsony": {
|
||||
"version": "1.1.5",
|
||||
"vcsRevision": "ea811bec7fa50f5abd3088ba94cda74285e93f18",
|
||||
|
|
|
@ -14,4 +14,5 @@ requires "nim >= 2.0.8"
|
|||
requires "cligen"
|
||||
requires "jsony"
|
||||
requires "zippy"
|
||||
requires "https://github.com/daylinmorgan/bbansi#9a85d9e"
|
||||
requires "https://github.com/daylinmorgan/hwylterm#9afc339"
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
## nix begat oizys
|
||||
import std/[os, tables, sequtils, strformat,strutils]
|
||||
|
||||
import cligen, bbansi
|
||||
import hwylterm
|
||||
import hwylterm/cli
|
||||
import oizys/[context, github, nix, overlay, logging]
|
||||
|
||||
|
||||
addHandler(
|
||||
newFancyConsoleLogger(
|
||||
levelThreshold=lvlAll,
|
||||
|
@ -91,31 +91,11 @@ proc `//`(t1: Table[string, string], t2: Table[string, string]): Table[string, s
|
|||
for k, v in t1.pairs(): result[k] = v
|
||||
for k, v in t2.pairs(): result[k] = v
|
||||
|
||||
proc setupCligen() =
|
||||
let isColor = getEnv("NO_COLOR") == ""
|
||||
if clCfg.useMulti == "":
|
||||
clCfg.useMulti =
|
||||
if isColor: "${doc}\e[1mUsage\e[m:\n $command {SUBCMD} [sub-command options & parameters]\n\n\e[1msubcommands\e[m:\n$subcmds"
|
||||
else: "${doc}Usage:\n $command {SUBCMD} [sub-command options & parameters]\n\nsubcommands:\n$subcmds"
|
||||
|
||||
if not isColor: return
|
||||
if clCfg.helpAttr.len == 0:
|
||||
clCfg.helpAttr = {"cmd": "\e[1;36m", "clDescrip": "", "clDflVal": "\e[33m",
|
||||
"clOptKeys": "\e[32m", "clValType": "\e[31m", "args": "\e[3m"}.toTable()
|
||||
clCfg.helpAttrOff = {"cmd": "\e[m", "clDescrip": "\e[m", "clDflVal": "\e[m",
|
||||
"clOptKeys": "\e[m", "clValType": "\e[m", "args": "\e[m"}.toTable()
|
||||
# clCfg.use does nothing?
|
||||
clCfg.useHdr = "\e[1musage\e[m:\n "
|
||||
|
||||
when isMainModule:
|
||||
import cligen
|
||||
checkExes()
|
||||
setupCligen()
|
||||
let (optOpen, optClose) =
|
||||
if getEnv("NO_COLOR") == "": ("\e[1m","\e[m")
|
||||
else: ("","")
|
||||
let
|
||||
usage = &"$command [flags]\n$doc{optOpen}Options{optClose}:\n$options"
|
||||
osUsage = &"$command [subcmd] [flags]\n$doc{optOpen}Options{optClose}:\n$options"
|
||||
hwylCli(clCfg)
|
||||
|
||||
const
|
||||
sharedHelp = {
|
||||
|
@ -133,15 +113,18 @@ when isMainModule:
|
|||
cacheHelp = {
|
||||
"name" : "name of cachix binary cache"
|
||||
}.toTable() // sharedHelp
|
||||
let
|
||||
# clUse must be set here using clCfg doesn't seem to work..
|
||||
clUse* = $bb("$command $args\n${doc}[bold]Options[/]:\n$options")
|
||||
osUsage = $bb("$command [[subcmd] $args\n$doc[bold]Options[/]:\n$options")
|
||||
|
||||
# setting clCfg.use wasn't working?
|
||||
dispatchMulti(
|
||||
[build, help = sharedHelp, usage = usage],
|
||||
[cache, help = cacheHelp, usage = usage],
|
||||
[ci, help = ciHelp, usage = usage],
|
||||
[dry, help = sharedHelp, usage = usage],
|
||||
[build, help = sharedHelp],
|
||||
[cache, help = cacheHelp ],
|
||||
[ci, help = ciHelp ],
|
||||
[dry, help = sharedHelp],
|
||||
[osCmd, help = sharedHelp, usage = osUsage, cmdName = "os"],
|
||||
[output, help = sharedHelp, usage = usage],
|
||||
[update, help = updateHelp, usage = usage],
|
||||
[output, help = sharedHelp],
|
||||
[update, help = updateHelp],
|
||||
)
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import std/[logging, os, strformat, strutils]
|
||||
from std/nativesockets import getHostname
|
||||
import bbansi
|
||||
import hwylterm
|
||||
import ./logging
|
||||
|
||||
type
|
||||
|
|
|
@ -3,7 +3,7 @@ import std/[
|
|||
strutils, streams, logging
|
||||
]
|
||||
|
||||
import ./spin
|
||||
import hwylterm
|
||||
|
||||
|
||||
func addArgs*(cmd: var string, args: openArray[string]) =
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import std/[httpclient,logging, os, strformat, strutils, json, tables, tempfiles]
|
||||
import jsony, bbansi, zippy/ziparchives
|
||||
import jsony, hwylterm, zippy/ziparchives
|
||||
import ./[logging, exec, context]
|
||||
|
||||
# localPassC is used by zippy but the additional
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import std/[logging,strutils]
|
||||
export logging
|
||||
|
||||
import bbansi
|
||||
import hwylterm
|
||||
|
||||
var
|
||||
handlers {.threadvar.}: seq[Logger]
|
||||
|
|
|
@ -3,7 +3,7 @@ import std/[
|
|||
enumerate, os, sequtils, strformat,
|
||||
strutils, sugar, logging, tables
|
||||
]
|
||||
import bbansi, jsony
|
||||
import hwylterm, jsony
|
||||
import ./[context, exec, logging]
|
||||
|
||||
|
||||
|
|
|
@ -1,137 +0,0 @@
|
|||
import std/[os, locks, sequtils, terminal]
|
||||
|
||||
import bbansi
|
||||
|
||||
type
|
||||
SpinnerKind* = enum
|
||||
Dots
|
||||
Spinner* = object
|
||||
interval*: int
|
||||
frames*: seq[string]
|
||||
|
||||
proc makeSpinner*(interval: int, frames: seq[string]): Spinner =
|
||||
Spinner(interval: interval, frames: frames)
|
||||
|
||||
const Spinners*: array[SpinnerKind, Spinner] = [
|
||||
# Dots
|
||||
Spinner(interval: 80, frames: @["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]),
|
||||
]
|
||||
|
||||
|
||||
type
|
||||
Spinny = ref object
|
||||
t: Thread[Spinny]
|
||||
lock: Lock
|
||||
text: string
|
||||
running: bool
|
||||
frames: seq[string]
|
||||
frame: string
|
||||
interval: int
|
||||
customSymbol: bool
|
||||
style: string
|
||||
|
||||
EventKind = enum
|
||||
Stop, SymbolChange, TextChange,
|
||||
|
||||
SpinnyEvent = object
|
||||
kind: EventKind
|
||||
payload: string
|
||||
|
||||
var spinnyChannel: Channel[SpinnyEvent]
|
||||
|
||||
proc newSpinny*(text: string, s: Spinner): Spinny =
|
||||
let style = "bold blue"
|
||||
Spinny(
|
||||
text: text,
|
||||
running: true,
|
||||
frames: mapIt(s.frames, $bb(it, style)),
|
||||
customSymbol: false,
|
||||
interval: s.interval,
|
||||
style: "bold blue"
|
||||
)
|
||||
|
||||
proc newSpinny*(text: string, spinType: SpinnerKind): Spinny =
|
||||
newSpinny(text, Spinners[spinType])
|
||||
|
||||
proc setSymbolColor*(spinny: Spinny, style: string) =
|
||||
spinny.frames = mapIt(spinny.frames, $bb(it, style))
|
||||
|
||||
proc setSymbol*(spinny: Spinny, symbol: string) =
|
||||
spinnyChannel.send(SpinnyEvent(kind: SymbolChange, payload: symbol))
|
||||
|
||||
proc setText*(spinny: Spinny, text: string) =
|
||||
spinnyChannel.send(SpinnyEvent(kind: TextChange, payload: text))
|
||||
|
||||
proc handleEvent(spinny: Spinny, eventData: SpinnyEvent): bool =
|
||||
result = true
|
||||
case eventData.kind
|
||||
of Stop:
|
||||
result = false
|
||||
of SymbolChange:
|
||||
spinny.customSymbol = true
|
||||
spinny.frame = eventData.payload
|
||||
of TextChange:
|
||||
spinny.text = eventData.payload
|
||||
|
||||
proc spinnyLoop(spinny: Spinny) {.thread.} =
|
||||
var frameCounter = 0
|
||||
|
||||
while spinny.running:
|
||||
let data = spinnyChannel.tryRecv()
|
||||
if data.dataAvailable:
|
||||
# If we received a Stop event
|
||||
if not spinny.handleEvent(data.msg):
|
||||
spinnyChannel.close()
|
||||
# This is required so we can reopen the same channel more than once
|
||||
# See https://github.com/nim-lang/Nim/issues/6369
|
||||
spinnyChannel = default(typeof(spinnyChannel))
|
||||
# TODO: Do we need spinny.running at all?
|
||||
spinny.running = false
|
||||
break
|
||||
|
||||
stdout.flushFile()
|
||||
if not spinny.customSymbol:
|
||||
spinny.frame = spinny.frames[frameCounter]
|
||||
|
||||
withLock spinny.lock:
|
||||
eraseLine()
|
||||
stdout.write(spinny.frame & " " & spinny.text)
|
||||
stdout.flushFile()
|
||||
|
||||
sleep spinny.interval
|
||||
|
||||
if frameCounter >= spinny.frames.len - 1:
|
||||
frameCounter = 0
|
||||
else:
|
||||
frameCounter += 1
|
||||
|
||||
proc start*(spinny: Spinny) =
|
||||
initLock spinny.lock
|
||||
spinnyChannel.open()
|
||||
createThread(spinny.t, spinnyLoop, spinny)
|
||||
|
||||
proc stop(spinny: Spinny, kind: EventKind, payload = "") =
|
||||
spinnyChannel.send(SpinnyEvent(kind: kind, payload: payload))
|
||||
spinnyChannel.send(SpinnyEvent(kind: Stop))
|
||||
joinThread spinny.t
|
||||
eraseLine stdout
|
||||
flushFile stdout
|
||||
|
||||
|
||||
proc stop*(spinny: Spinny) =
|
||||
spinny.stop(Stop)
|
||||
|
||||
template withSpinner*(msg: string = "", body: untyped): untyped =
|
||||
var spinner {.inject.} = newSpinny(msg, Dots)
|
||||
if isatty(stdout): # don't spin if it's not a tty
|
||||
start spinner
|
||||
|
||||
body
|
||||
|
||||
if isatty(stdout):
|
||||
stop spinner
|
||||
|
||||
template withSpinner*(body: untyped): untyped =
|
||||
withSpinner("", body)
|
||||
|
||||
|
Loading…
Reference in a new issue