package rgb import ( "fmt" "strconv" "github.com/spf13/cobra" intdevice "github.com/wobkey/rgb/internal/device" "github.com/wobkey/rgb/internal/via" ) var targetDevice string func OpenDevice() (*via.Protocol, intdevice.Keyboard, error) { keyboards, err := intdevice.LoadKeyboards() if err != nil { return nil, intdevice.Keyboard{}, fmt.Errorf("load keyboards: %w", err) } devices, err := intdevice.Discover(keyboards) if err != nil { return nil, intdevice.Keyboard{}, fmt.Errorf("discover: %w", err) } if len(devices) == 0 { return nil, intdevice.Keyboard{}, fmt.Errorf("no VIA-compatible keyboard found") } var dev intdevice.Device if targetDevice != "" { for _, d := range devices { if d.Path == targetDevice { dev = d break } } if dev.Path == "" { return nil, intdevice.Keyboard{}, fmt.Errorf("device %s not found", targetDevice) } } else if len(devices) == 1 { dev = devices[0] } else { return nil, intdevice.Keyboard{}, fmt.Errorf("multiple devices found, use --device to specify") } proto, err := via.New(dev) if err != nil { return nil, intdevice.Keyboard{}, fmt.Errorf("open protocol: %w", err) } return proto, dev.Keyboard, nil } func ParseUint8(s string) (uint8, error) { v, err := strconv.ParseUint(s, 10, 8) if err != nil { return 0, fmt.Errorf("invalid value: %w", err) } return uint8(v), nil } func Init() *cobra.Command { cmd := &cobra.Command{ Use: "rgb", Short: "RGB lighting commands", } cmd.Flags().StringVar(&targetDevice, "device", "", "HID device path to use") return cmd }