package main import ( "context" "fmt" "git.aiterp.net/lucifer/new-server/app/client" "git.aiterp.net/lucifer/new-server/internal/color" "git.aiterp.net/lucifer/new-server/models" "log" "os" "strings" ) func main() { cfg, err := loadConfig() if err != nil { log.Println("Config at $HOME/.config/lucy.yaml failed:", err) cfg = &Config{Remote: "http://localhost:8000"} } ctx := context.Background() c := client.Client{APIRoot: cfg.Remote} cmd := parseCommand(os.Args[1:]) switch cmd.Name { // DEVICE case "list": { fetchStr := cmd.Params.Get(0).String() if fetchStr == nil { s := "all" fetchStr = &s } devices, err := c.GetDevices(ctx, *fetchStr) if err != nil { log.Fatalln(err) } if info := cmd.Params.Get("info").String(); info != nil { WriteDeviceInfo(os.Stdout, devices, strings.Split(*info, ",")) } else { WriteDeviceStateTable(os.Stdout, devices) } } case "set": { devices, err := c.PutDeviceState(ctx, cmd.Params.Get(0).StringOr("all"), cmd.Params.DeviceState("")) if err != nil { log.Fatalln(err) } WriteDeviceStateTable(os.Stdout, devices) } case "tag": { var addTags []string var removeTags []string for _, tag := range cmd.Params.Strings(1) { if strings.HasPrefix(tag, "+") { addTags = append(addTags, tag[1:]) } else if strings.HasPrefix(tag, "-") { removeTags = append(removeTags, tag[1:]) } else { addTags = append(addTags, tag) } } devices, err := c.PutDeviceTags( ctx, cmd.Params.Get(0).StringOr("all"), addTags, removeTags, ) if err != nil { log.Fatalln(err) } WriteDeviceInfoTable(os.Stdout, devices) } case "update": { devices, err := c.PutDevice(ctx, cmd.Params.Get(0).StringOr("all"), models.DeviceUpdate{ Name: cmd.Params.Get("name").String(), Icon: cmd.Params.Get("icon").String(), UserProperties: cmd.Params.Subset("prop.").StringPtrMap(), }) if err != nil { log.Fatalln(err) } WriteDeviceInfoTable(os.Stdout, devices) } case "color": { col, err := color.Parse(cmd.Params.Get(0).StringOr("hs:0,0")) if err != nil { log.Fatalln(err) } if col.IsKelvin() { fmt.Println(col.String()) } if hs, ok := col.ToHS(); ok { fmt.Println(hs.String()) } if hsk, ok := col.ToHSK(); ok { fmt.Println(hsk.String()) } if xy, ok := col.ToXY(); ok { fmt.Println(xy.String()) } if rgb, ok := col.ToRGB(); ok { fmt.Println(rgb.String()) } } case "factory": factoryCmd(ctx, c) case "handler": handlerCmd(ctx, c) case "scene": sceneCmd(ctx, c) // EVENT case "run": { name := cmd.Params.Get(0).String() if name == nil { return } event := models.Event{ Name: *name, Payload: cmd.Params.StringMap(), } err := c.FireEvent(ctx, event) if err != nil { log.Fatalln(err) } } default: if cmd.Name != "help" { log.Println("Unknown command:", cmd.Name) } _, _ = fmt.Fprintln(os.Stderr, helpString[1:]) } }