Compare commits

...

9 Commits

17 changed files with 331 additions and 167 deletions

View File

@ -1,18 +1,27 @@
LUME_VERSION ?= $(shell git describe --tags --always) V ?= 0
LDFLAGS := ${LDFLAGS} -X git.kill0.net/chill9/lume/cmd.Version=${LUME_VERSION} Q = $(if $(filter 1, $V),, @)
ifeq ($(OS), Windows_NT) ifeq ($(OS), Windows_NT)
EXE=lume.exe EXE=lume.exe
RM=del /f /q RM=del /f /q
BUILD_DATE=$(shell powershell Get-Date -Format "yyyy-MM-ddThh:mm:sszzz")
else else
EXE=lume EXE=lume
EXE=rm -f EXE=rm -f
BUILD_DATE=$(shell date --iso-8601=seconds)
endif endif
LUME_VERSION ?= $(shell git describe --tags --always)
GIT_COMMIT := $(shell git rev-parse --short HEAD)
LDFLAGS := $(LDFLAGS) \
-X git.kill0.net/chill9/lume/cmd.Version=$(LUME_VERSION) \
-X git.kill0.net/chill9/lume/cmd.BuildDate=$(BUILD_DATE) \
-X git.kill0.net/chill9/lume/cmd.GitCommit=$(GIT_COMMIT)
.PHONY: build .PHONY: build
build: build:
go build -o ${EXE} -ldflags="${LDFLAGS}" ./cmd/lume $(Q) go build -o $(EXE) -ldflags="$(LDFLAGS)" ./cmd/lume
.PHONY: clean .PHONY: clean
clean: clean:
${RM} ${EXE} $(Q) $(RM) $(EXE)

View File

@ -16,11 +16,13 @@ const (
type Config struct { type Config struct {
AccessToken string `toml:"access_token"` AccessToken string `toml:"access_token"`
OutputFormat string `toml:"output_format"`
Colors map[string][]float32 `toml:"colors"` Colors map[string][]float32 `toml:"colors"`
} }
type CmdArgs struct { type CmdArgs struct {
Flags Flags Flags Flags
Args []string
Client *lifx.Client Client *lifx.Client
Config Config Config Config
Name string Name string
@ -55,6 +57,7 @@ var (
defaultSaturation string = "" defaultSaturation string = ""
defaultRGB string = "" defaultRGB string = ""
defaultName string = "" defaultName string = ""
defaultOutputFormat string = ""
) )
func (f Flags) String(name string) string { func (f Flags) String(name string) string {

View File

@ -1,7 +1,6 @@
package lumecmd package lumecmd
import ( import (
"flag"
"fmt" "fmt"
"sort" "sort"
) )
@ -10,23 +9,16 @@ func NewCmdHelp() Command {
return Command{ return Command{
Name: "help", Name: "help",
Func: HelpCmd, Func: HelpCmd,
Flags: func() *flag.FlagSet {
fs := flag.NewFlagSet("help", flag.ExitOnError)
return fs
}(),
Use: "<command>", Use: "<command>",
Short: "Show help for a command", Short: "Show help for a command",
} }
} }
func HelpCmd(args CmdArgs) (int, error) { func HelpCmd(args CmdArgs) (int, error) {
argv := args.Flags.Args() if len(args.Args) == 0 {
if len(argv) == 0 {
printHelp(commandRegistry) printHelp(commandRegistry)
} else if len(argv) >= 1 { } else if len(args.Args) >= 1 {
printCmdHelp(argv[0]) printCmdHelp(args.Args[0])
} }
return ExitSuccess, nil return ExitSuccess, nil
@ -63,11 +55,15 @@ func printCmdHelp(name string) error {
if subCmd.Use != "" { if subCmd.Use != "" {
fmt.Printf("usage:\n lume %s %s\n", subCmd.Name, subCmd.Use) fmt.Printf("usage:\n lume %s %s\n", subCmd.Name, subCmd.Use)
fmt.Println() } else {
fmt.Printf("usage:\n lume %s\n", subCmd.Name)
} }
if subCmd.Flags != nil {
fmt.Println()
fmt.Print("flags:\n") fmt.Print("flags:\n")
subCmd.Flags.PrintDefaults() subCmd.Flags.PrintDefaults()
}
return nil return nil
} }

View File

@ -1,6 +1,8 @@
package lumecmd package lumecmd
import "flag" import (
"flag"
)
func NewCmdLs() Command { func NewCmdLs() Command {
return Command{ return Command{
@ -12,6 +14,8 @@ func NewCmdLs() Command {
selector := fs.String("selector", defaultSelector, "Set the selector") selector := fs.String("selector", defaultSelector, "Set the selector")
fs.StringVar(selector, "s", defaultSelector, "Set the selector") fs.StringVar(selector, "s", defaultSelector, "Set the selector")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector=<selector>]", Use: "[--selector=<selector>]",
@ -22,10 +26,23 @@ func NewCmdLs() Command {
func LsCmd(args CmdArgs) (int, error) { func LsCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
lights, err := c.ListLights(selector) lights, err := c.ListLights(selector)
if err != nil { if err != nil {
return ExitFailure, err return ExitFailure, err
} }
switch format {
case "table":
PrintLightsTable(lights)
default:
PrintLights(lights) PrintLights(lights)
}
return ExitSuccess, nil return ExitSuccess, nil
} }

View File

@ -29,7 +29,9 @@ func init() {
RegisterCommand(NewCmdVersion()) RegisterCommand(NewCmdVersion())
} }
var Version string = "0.1.0-pre" var Version string
var BuildDate string
var GitCommit string
const lumercFile string = ".lumerc" const lumercFile string = ".lumerc"
@ -73,6 +75,7 @@ func Main(args []string) (int, error) {
cmdArgs := CmdArgs{ cmdArgs := CmdArgs{
Client: c, Client: c,
Config: config, Config: config,
Args: args[2:],
} }
cmd, ok := GetCommand(command) cmd, ok := GetCommand(command)
@ -80,11 +83,14 @@ func Main(args []string) (int, error) {
err = fmt.Errorf("lume: '%s' is not lume command. See 'lume help'", command) err = fmt.Errorf("lume: '%s' is not lume command. See 'lume help'", command)
return ExitFailure, err return ExitFailure, err
} }
fs := cmd.Flags
fs.Parse(args[2:])
fs := cmd.Flags
if fs != nil {
fs.Parse(args[2:])
cmdArgs.Flags = Flags{FlagSet: fs} cmdArgs.Flags = Flags{FlagSet: fs}
}
cmdArgs.Name = command cmdArgs.Name = command
exitCode, err := cmd.Func(cmdArgs) exitCode, err := cmd.Func(cmdArgs)
if err != nil { if err != nil {
err = fmt.Errorf("fatal: %s", err) err = fmt.Errorf("fatal: %s", err)

View File

@ -19,6 +19,8 @@ func NewCmdPoweroff() Command {
selector := fs.String("selector", defaultSelector, "Set the selector") selector := fs.String("selector", defaultSelector, "Set the selector")
fs.StringVar(selector, "s", defaultSelector, "Set the selector") fs.StringVar(selector, "s", defaultSelector, "Set the selector")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector <selector>] [--duration <sec>]", Use: "[--selector <selector>] [--duration <sec>]",
@ -30,12 +32,24 @@ func PoweroffCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
duration := args.Flags.Float64("duration") duration := args.Flags.Float64("duration")
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
state := lifx.State{Power: "off", Duration: duration} state := lifx.State{Power: "off", Duration: duration}
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
r, err := c.SetState(selector, state) r, err := c.SetState(selector, state)
if err != nil { if err != nil {
return ExitFailure, err return ExitFailure, err
} }
switch format {
case "table":
PrintResultsTable(r.Results)
default:
PrintResults(r.Results) PrintResults(r.Results)
}
return ExitSuccess, nil return ExitSuccess, nil
} }

View File

@ -19,6 +19,8 @@ func NewCmdPoweron() Command {
selector := fs.String("selector", defaultSelector, "Set the selector") selector := fs.String("selector", defaultSelector, "Set the selector")
fs.StringVar(selector, "s", defaultSelector, "Set the selector") fs.StringVar(selector, "s", defaultSelector, "Set the selector")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector <selector>] [--duration <sec>]", Use: "[--selector <selector>] [--duration <sec>]",
@ -30,12 +32,24 @@ func PoweronCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
duration := args.Flags.Float64("duration") duration := args.Flags.Float64("duration")
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
state := lifx.State{Power: "on", Duration: duration} state := lifx.State{Power: "on", Duration: duration}
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
r, err := c.SetState(selector, state) r, err := c.SetState(selector, state)
if err != nil { if err != nil {
return ExitFailure, err return ExitFailure, err
} }
switch format {
case "table":
PrintResultsTable(r.Results)
default:
PrintResults(r.Results) PrintResults(r.Results)
}
return ExitSuccess, nil return ExitSuccess, nil
} }

145
cmd/print.go Normal file
View File

@ -0,0 +1,145 @@
package lumecmd
import (
"fmt"
"os"
"time"
"git.kill0.net/chill9/lifx-go"
"github.com/fatih/color"
"github.com/olekukonko/tablewriter"
)
func ColorizePower(s string) string {
c := color.New(color.FgRed)
if s == "on" {
c = color.New(color.FgGreen)
}
return c.Sprint(s)
}
func ColorizeStatus(s lifx.Status) string {
c := color.New(color.FgRed)
if s == "ok" {
c = color.New(color.FgGreen)
}
return c.Sprint(s)
}
func PrintWithIndent(indent int, s string) {
fmt.Printf("%*s%s", indent, "", s)
}
func PrintfWithIndent(indent int, format string, a ...interface{}) (n int, err error) {
format = fmt.Sprintf("%*s%s", indent, "", format)
return fmt.Printf(format, a...)
}
func makeLightsTable(lights []lifx.Light) (hdr []string, rows [][]string) {
hdr = []string{"ID", "Location", "Group", "Label", "Last Seen", "Power"}
for _, l := range lights {
rows = append(rows, []string{
fmt.Sprint(l.Id),
fmt.Sprint(l.Location.Name),
fmt.Sprint(l.Group.Name),
fmt.Sprint(l.Label),
fmt.Sprint(l.LastSeen.Local().Format(time.RFC3339)),
fmt.Sprint(ColorizePower(l.Power)),
})
}
return
}
func makeResultsTable(results []lifx.Result) (hdr []string, rows [][]string) {
hdr = []string{"ID", "Label", "Status"}
for _, r := range results {
rows = append(rows, []string{
fmt.Sprint(r.Id),
fmt.Sprint(r.Label),
fmt.Sprint(ColorizeStatus(r.Status)),
})
}
return
}
func PrintLights(lights []lifx.Light) {
sortLights(lights)
table := tablewriter.NewWriter(os.Stdout)
_, rows := makeLightsTable(lights)
for _, v := range rows {
table.Append(v)
}
fmt.Printf("total %d\n", len(lights))
table.SetAlignment(tablewriter.ALIGN_LEFT)
table.SetAutoWrapText(false)
table.SetBorder(false)
table.SetCenterSeparator("")
table.SetColumnSeparator("")
table.SetHeaderLine(false)
table.SetNoWhiteSpace(true)
table.SetRowSeparator("")
table.SetTablePadding(" ")
table.Render()
}
func PrintLightsTable(lights []lifx.Light) {
sortLights(lights)
table := tablewriter.NewWriter(os.Stdout)
hdr, rows := makeLightsTable(lights)
for _, v := range rows {
table.Append(v)
}
table.SetHeader(hdr)
table.Render()
}
func PrintResults(results []lifx.Result) {
sortResults(results)
table := tablewriter.NewWriter(os.Stdout)
_, rows := makeResultsTable(results)
for _, v := range rows {
table.Append(v)
}
fmt.Printf("total %d\n", len(results))
table.SetAlignment(tablewriter.ALIGN_LEFT)
table.SetAutoWrapText(false)
table.SetBorder(false)
table.SetCenterSeparator("")
table.SetColumnSeparator("")
table.SetHeaderLine(false)
table.SetNoWhiteSpace(true)
table.SetRowSeparator("")
table.SetTablePadding(" ")
table.Render()
}
func PrintResultsTable(results []lifx.Result) {
sortResults(results)
table := tablewriter.NewWriter(os.Stdout)
hdr, rows := makeResultsTable(results)
for _, v := range rows {
table.Append(v)
}
table.SetHeader(hdr)
table.Render()
}

View File

@ -41,6 +41,8 @@ func NewCmdSetColor() Command {
fast := fs.Bool("fast", defaultFast, "fast state") fast := fs.Bool("fast", defaultFast, "fast state")
fs.BoolVar(fast, "f", defaultFast, "fast state") fs.BoolVar(fast, "f", defaultFast, "fast state")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector <selector>] [--power (on|off)] [--hue <hue>] [--saturation <saturation>] [--rgb <rbg>] [--name <color>] [--brightness <brightness>] [--duration <sec>] [--fast]", Use: "[--selector <selector>] [--power (on|off)] [--hue <hue>] [--saturation <saturation>] [--rgb <rbg>] [--name <color>] [--brightness <brightness>] [--duration <sec>] [--fast]",
@ -52,6 +54,11 @@ func SetColorCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
state := lifx.State{} state := lifx.State{}
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
power := args.Flags.String("power") power := args.Flags.String("power")
if power != "" { if power != "" {
@ -119,8 +126,13 @@ func SetColorCmd(args CmdArgs) (int, error) {
} }
if !fast { if !fast {
switch format {
case "table":
PrintResultsTable(r.Results)
default:
PrintResults(r.Results) PrintResults(r.Results)
} }
}
return ExitSuccess, nil return ExitSuccess, nil
} }

View File

@ -34,6 +34,8 @@ func NewCmdSetState() Command {
fast := fs.Bool("fast", defaultFast, "fast state") fast := fs.Bool("fast", defaultFast, "fast state")
fs.BoolVar(fast, "f", defaultFast, "fast state") fs.BoolVar(fast, "f", defaultFast, "fast state")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector <selector>] [--power (on|off)] [--color <color>] [--brightness <brightness>] [--duration <sec>] [--infrared <infrared>] [--fast]", Use: "[--selector <selector>] [--power (on|off)] [--color <color>] [--brightness <brightness>] [--duration <sec>] [--infrared <infrared>] [--fast]",
@ -45,6 +47,11 @@ func SetStateCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
state := lifx.State{} state := lifx.State{}
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
power := args.Flags.String("power") power := args.Flags.String("power")
if power != "" { if power != "" {
@ -85,8 +92,13 @@ func SetStateCmd(args CmdArgs) (int, error) {
} }
if !fast { if !fast {
switch format {
case "table":
PrintResultsTable(r.Results)
default:
PrintResults(r.Results) PrintResults(r.Results)
} }
}
return ExitSuccess, nil return ExitSuccess, nil
} }

View File

@ -37,6 +37,8 @@ func NewCmdSetWhite() Command {
fast := fs.Bool("fast", defaultFast, "fast state") fast := fs.Bool("fast", defaultFast, "fast state")
fs.BoolVar(fast, "f", defaultFast, "fast state") fs.BoolVar(fast, "f", defaultFast, "fast state")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector <selector>] [--power (on|off)] [--kelvin <kelvin>] [--name <color>] [--brightness <brightness>] [--duration <sec>] [--infrared] [--fast]", Use: "[--selector <selector>] [--power (on|off)] [--kelvin <kelvin>] [--name <color>] [--brightness <brightness>] [--duration <sec>] [--infrared] [--fast]",
@ -48,6 +50,11 @@ func SetWhiteCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
state := lifx.State{} state := lifx.State{}
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
power := args.Flags.String("power") power := args.Flags.String("power")
if power != "" { if power != "" {
@ -103,8 +110,13 @@ func SetWhiteCmd(args CmdArgs) (int, error) {
} }
if !fast { if !fast {
switch format {
case "table":
PrintResultsTable(r.Results)
default:
PrintResults(r.Results) PrintResults(r.Results)
} }
}
return ExitSuccess, nil return ExitSuccess, nil
} }

View File

@ -42,7 +42,7 @@ func ShowCmd(args CmdArgs) (int, error) {
"Light ID: %s, %s, Power: %s\n", "Light ID: %s, %s, Power: %s\n",
l.Id, l.Id,
connected(l.Connected), connected(l.Connected),
powerColor(l.Power), ColorizePower(l.Power),
) )
indent += Tabstop indent += Tabstop
PrintfWithIndent(indent, "Label: %s, ID: %s\n", l.Label, l.Id) PrintfWithIndent(indent, "Label: %s, ID: %s\n", l.Label, l.Id)

View File

@ -17,6 +17,8 @@ func NewCmdToggle() Command {
selector := fs.String("selector", defaultSelector, "Set the selector") selector := fs.String("selector", defaultSelector, "Set the selector")
fs.StringVar(selector, "s", defaultSelector, "Set the selector") fs.StringVar(selector, "s", defaultSelector, "Set the selector")
fs.String("format", defaultOutputFormat, "Set the output format")
return fs return fs
}(), }(),
Use: "[--selector <selector>] [--duration <sec>]", Use: "[--selector <selector>] [--duration <sec>]",
@ -28,10 +30,23 @@ func ToggleCmd(args CmdArgs) (int, error) {
c := args.Client c := args.Client
duration := args.Flags.Float64("duration") duration := args.Flags.Float64("duration")
selector := args.Flags.String("selector") selector := args.Flags.String("selector")
format := args.Flags.String("format")
if format == "" && args.Config.OutputFormat != "" {
format = args.Config.OutputFormat
}
r, err := c.Toggle(selector, duration) r, err := c.Toggle(selector, duration)
if err != nil { if err != nil {
return ExitFailure, err return ExitFailure, err
} }
switch format {
case "table":
PrintResultsTable(r.Results)
default:
PrintResults(r.Results) PrintResults(r.Results)
}
return ExitSuccess, nil return ExitSuccess, nil
} }

View File

@ -6,116 +6,10 @@ import (
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
"time"
"git.kill0.net/chill9/lifx-go" "git.kill0.net/chill9/lifx-go"
) )
func powerColor(s string) string {
fs := "\033[1;31m%s\033[0m"
if s == "on" {
fs = "\033[1;32m%s\033[0m"
}
return fmt.Sprintf(fs, s)
}
func statusColor(s lifx.Status) string {
fs := "\033[1;31m%s\033[0m"
if s == "ok" {
fs = "\033[1;32m%s\033[0m"
}
return fmt.Sprintf(fs, s)
}
func PrintResults(res []lifx.Result) {
var length int
var widths map[string]int
widths = make(map[string]int)
for _, r := range res {
length = len(r.Id)
if widths["id"] < length {
widths["id"] = length
}
length = len(r.Label)
if widths["label"] < length {
widths["label"] = length
}
length = len(r.Status)
if widths["status"] < length {
widths["status"] = length
}
}
sortResults(res)
for _, r := range res {
fmt.Printf("%*s %*s %*s\n",
widths["id"], r.Id,
widths["label"], r.Label,
widths["status"], statusColor(r.Status))
}
}
func PrintLights(lights []lifx.Light) {
var length int
var widths map[string]int
widths = make(map[string]int)
for _, l := range lights {
length = len(l.Id)
if widths["id"] < length {
widths["id"] = length
}
length = len(l.Location.Name)
if widths["location"] < length {
widths["location"] = length
}
length = len(l.Group.Name)
if widths["group"] < length {
widths["group"] = length
}
length = len(l.Label)
if widths["label"] < length {
widths["label"] = length
}
length = len(l.LastSeen.Local().Format(time.RFC3339))
if widths["last_seen"] < length {
widths["last_seen"] = length
}
length = len(l.Power)
if widths["power"] < length {
widths["power"] = length
}
}
sortLights(lights)
fmt.Printf("total %d\n", len(lights))
for _, l := range lights {
fmt.Printf(
"%*s %*s %*s %*s %*s %-*s\n",
widths["id"], l.Id,
widths["loction"], l.Location.Name,
widths["group"], l.Group.Name,
widths["label"], l.Label,
widths["last_seen"], l.LastSeen.Local().Format(time.RFC3339),
widths["power"], powerColor(l.Power),
)
}
}
func parseRGB(s string) (lifx.RGBColor, error) { func parseRGB(s string) (lifx.RGBColor, error) {
var c lifx.RGBColor var c lifx.RGBColor
rgb := strings.SplitN(s, ",", 3) rgb := strings.SplitN(s, ",", 3)
@ -166,12 +60,3 @@ func YesNo(v bool) string {
} }
return "no" return "no"
} }
func PrintWithIndent(indent int, s string) {
fmt.Printf("%*s%s", indent, "", s)
}
func PrintfWithIndent(indent int, format string, a ...interface{}) (n int, err error) {
format = fmt.Sprintf("%*s%s", indent, "", format)
return fmt.Printf(format, a...)
}

View File

@ -2,7 +2,7 @@ package lumecmd
import ( import (
"fmt" "fmt"
"runtime" "strings"
) )
func NewCmdVersion() Command { func NewCmdVersion() Command {
@ -16,8 +16,18 @@ func NewCmdVersion() Command {
} }
func VersionCmd(args CmdArgs) (int, error) { func VersionCmd(args CmdArgs) (int, error) {
fmt.Printf("lume %s\n", Version) var b strings.Builder
fmt.Printf(" os/arch: %s/%s\n", runtime.GOOS, runtime.GOARCH)
fmt.Printf(" go version: %s\n", runtime.Version()) fmt.Fprintf(&b, "lume %s", Version)
b.WriteString(" ")
if GitCommit != "" {
fmt.Fprintf(&b, "(git: %s)", GitCommit)
b.WriteString(" ")
}
if BuildDate != "" {
fmt.Fprintf(&b, "build_date: %s", BuildDate)
}
fmt.Println(b.String())
return ExitSuccess, nil return ExitSuccess, nil
} }

2
go.mod
View File

@ -5,5 +5,7 @@ go 1.15
require ( require (
git.kill0.net/chill9/lifx-go v0.0.0-20210215004437-f86c28b0a5ef git.kill0.net/chill9/lifx-go v0.0.0-20210215004437-f86c28b0a5ef
github.com/BurntSushi/toml v0.3.1 github.com/BurntSushi/toml v0.3.1
github.com/fatih/color v1.10.0
github.com/olekukonko/tablewriter v0.0.5
golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061 golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061
) )

12
go.sum
View File

@ -2,5 +2,17 @@ git.kill0.net/chill9/lifx-go v0.0.0-20210215004437-f86c28b0a5ef h1:8yyXAk+qiRvro
git.kill0.net/chill9/lifx-go v0.0.0-20210215004437-f86c28b0a5ef/go.mod h1:ZFKIcwdJ4Nqlrkn/eUHbeLt0NVhFsfxBREkVoA+jzUc= git.kill0.net/chill9/lifx-go v0.0.0-20210215004437-f86c28b0a5ef/go.mod h1:ZFKIcwdJ4Nqlrkn/eUHbeLt0NVhFsfxBREkVoA+jzUc=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061 h1:DQmQoKxQWtyybCtX/3dIuDBcAhFszqq8YiNeS6sNu1c= golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061 h1:DQmQoKxQWtyybCtX/3dIuDBcAhFszqq8YiNeS6sNu1c=
golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=