From d5c88f31e0480b3a9dbae3e0795e5445c0880ae6 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Sat, 31 Jan 2026 01:29:14 +0000 Subject: [PATCH] add persistent flag --kind use it to configure the client --- cmd/context.go | 6 +++--- cmd/root.go | 11 ++++++++++- internal/xair/address.go | 9 +++++++++ internal/xair/client.go | 15 ++++++++------- internal/xair/kinds.go | 19 +++++++++++++++++++ internal/xair/option.go | 14 +++----------- 6 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 internal/xair/kinds.go diff --git a/cmd/context.go b/cmd/context.go index 8b6be19..d7be5a8 100644 --- a/cmd/context.go +++ b/cmd/context.go @@ -11,12 +11,12 @@ import ( type clientKey string -func WithContext(ctx context.Context, client *xair.XAirClient) context.Context { +func WithContext(ctx context.Context, client *xair.Client) context.Context { return context.WithValue(ctx, clientKey("oscClient"), client) } -func ClientFromContext(ctx context.Context) *xair.XAirClient { - if client, ok := ctx.Value(clientKey("oscClient")).(*xair.XAirClient); ok { +func ClientFromContext(ctx context.Context) *xair.Client { + if client, ok := ctx.Value(clientKey("oscClient")).(*xair.Client); ok { return client } return nil diff --git a/cmd/root.go b/cmd/root.go index 92ab513..4253847 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -28,7 +28,14 @@ various commands to manage mixer settings directly from the terminal.`, } log.SetLevel(level) - client, err := xair.NewClient(viper.GetString("host"), viper.GetInt("port")) + kind := xair.NewMixerKind(viper.GetString("kind")) + log.Debugf("Initializing client for mixer kind: %s", kind) + + client, err := xair.NewClient( + viper.GetString("host"), + viper.GetInt("port"), + xair.WithKind(string(kind)), + ) if err != nil { return err } @@ -68,6 +75,7 @@ func init() { rootCmd.PersistentFlags().IntP("port", "p", 10024, "Port number of the X Air mixer") rootCmd.PersistentFlags(). StringP("loglevel", "l", "warn", "Log level (debug, info, warn, error, fatal, panic)") + rootCmd.PersistentFlags().StringP("kind", "k", "xair", "Kind of mixer (xair, x32)") viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) viper.SetEnvPrefix("XAIR_CLI") @@ -75,4 +83,5 @@ func init() { viper.BindPFlag("host", rootCmd.PersistentFlags().Lookup("host")) viper.BindPFlag("port", rootCmd.PersistentFlags().Lookup("port")) viper.BindPFlag("loglevel", rootCmd.PersistentFlags().Lookup("loglevel")) + viper.BindPFlag("kind", rootCmd.PersistentFlags().Lookup("kind")) } diff --git a/internal/xair/address.go b/internal/xair/address.go index 003d13f..8a69835 100644 --- a/internal/xair/address.go +++ b/internal/xair/address.go @@ -7,3 +7,12 @@ var xairAddressMap = map[string]string{ var x32AddressMap = map[string]string{ "bus": "/bus/%02d", } + +func addressMapForMixerKind(kind MixerKind) map[string]string { + switch kind { + case KindX32: + return x32AddressMap + default: + return xairAddressMap + } +} diff --git a/internal/xair/client.go b/internal/xair/client.go index ae30dcb..b617269 100644 --- a/internal/xair/client.go +++ b/internal/xair/client.go @@ -18,7 +18,7 @@ type parser interface { } type engine struct { - Kind string + Kind MixerKind conn *net.UDPConn mixerAddr *net.UDPAddr @@ -54,12 +54,13 @@ func NewClient(mixerIP string, mixerPort int, opts ...Option) (*Client, error) { log.Debugf("Local UDP connection: %s ", conn.LocalAddr().String()) e := &engine{ - Kind: "xair", - conn: conn, - mixerAddr: mixerAddr, - parser: newParser(), - done: make(chan bool), - respChan: make(chan *osc.Message, 100), + Kind: KindXAir, + conn: conn, + mixerAddr: mixerAddr, + parser: newParser(), + addressMap: addressMapForMixerKind(KindXAir), + done: make(chan bool), + respChan: make(chan *osc.Message, 100), } for _, opt := range opts { diff --git a/internal/xair/kinds.go b/internal/xair/kinds.go new file mode 100644 index 0000000..193e33e --- /dev/null +++ b/internal/xair/kinds.go @@ -0,0 +1,19 @@ +package xair + +type MixerKind string + +const ( + KindXAir MixerKind = "xair" + KindX32 MixerKind = "x32" +) + +func NewMixerKind(kind string) MixerKind { + switch kind { + case "xair": + return KindXAir + case "x32": + return KindX32 + default: + return KindXAir + } +} diff --git a/internal/xair/option.go b/internal/xair/option.go index 4370c58..38be1dd 100644 --- a/internal/xair/option.go +++ b/internal/xair/option.go @@ -1,18 +1,10 @@ package xair -import "strings" - type Option func(*engine) func WithKind(kind string) Option { - if strings.EqualFold(kind, "x32") { - return func(c *engine) { - c.Kind = kind - c.addressMap = x32AddressMap - } - } - return func(c *engine) { - c.Kind = "xair" - c.addressMap = xairAddressMap + return func(e *engine) { + e.Kind = MixerKind(kind) + e.addressMap = addressMapForMixerKind(e.Kind) } }