diff --git a/cmd/bspwm/main.go b/cmd/bspwm/main.go index 68094c8..7f2aae8 100644 --- a/cmd/bspwm/main.go +++ b/cmd/bspwm/main.go @@ -65,7 +65,7 @@ func _main() error { handler.AddDomain[domains.Todo](h, "monitor") handler.AddDomain[domains.Wm](h, "wm") handler.AddDomain[domains.Todo](h, "rule") - handler.AddDomain[domains.Todo](h, "config") + handler.AddDomain[domains.Config](h, "config") handler.AddDomain[domains.Todo](h, "subscribe") handler.AddDomain[domains.Todo](h, "quit") handler.AddDomain[domains.Query](h, "query") diff --git a/src/bsp/cfg/cfg.go b/src/bsp/cfg/cfg.go index b22d399..df847cb 100644 --- a/src/bsp/cfg/cfg.go +++ b/src/bsp/cfg/cfg.go @@ -73,9 +73,6 @@ func (m *Modifier[T]) FillDefaults() { ft := rt.Field(i) k := ft.Tag.Get("cfg") dv := ft.Tag.Get("default") - if dv == "" { - continue - } m.Set(k, dv) } return @@ -92,10 +89,13 @@ func (m *Modifier[T]) setup() { kind := ft.Type.Elem().Kind() switch kind { case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - m.setters[k] = func(v string) error { - val, err := strconv.ParseUint(v, 10, 64) - if err != nil { - return copies.NewInvalidValueErr(k, v) + m.setters[k] = func(v string) (err error) { + var val uint64 + if v != "" { + val, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return copies.NewInvalidValueErr(k, v) + } } if fv.IsNil() { fv.Set(reflect.New(ft.Type.Elem())) @@ -110,10 +110,13 @@ func (m *Modifier[T]) setup() { return fmt.Sprintf("%v", fv.Elem()), nil } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - m.setters[k] = func(v string) error { - val, err := strconv.Atoi(v) - if err != nil { - return copies.NewInvalidValueErr(k, v) + m.setters[k] = func(v string) (err error) { + var val int + if v != "" { + val, err = strconv.Atoi(v) + if err != nil { + return copies.NewInvalidValueErr(k, v) + } } if fv.IsNil() { fv.Set(reflect.New(ft.Type.Elem())) @@ -133,7 +136,7 @@ func (m *Modifier[T]) setup() { switch strings.ToLower(v) { case "true", "on": b = true - case "false", "off": + case "false", "off", "": b = false default: return copies.NewInvalidValueErr(k, v) diff --git a/src/bsp/cfg/cfg_test.go b/src/bsp/cfg/cfg_test.go index 4b2b4f1..654c236 100644 --- a/src/bsp/cfg/cfg_test.go +++ b/src/bsp/cfg/cfg_test.go @@ -24,8 +24,6 @@ type s1 struct { func TestModifierS1(t *testing.T) { s := &s1{} m := cfg.NewModifier(s) - m.FillDefaults() - assert.EqualValues(t, *m.Ref.C, "crabs") m.Set("b", "on") assert.EqualValues(t, *m.Ref.B, true) @@ -33,4 +31,7 @@ func TestModifierS1(t *testing.T) { m.Set("d", "442") assert.EqualValues(t, *m.Ref.D, 442) + m.FillDefaults() + assert.EqualValues(t, *m.Ref.C, "crabs") + } diff --git a/src/handler/domains/config.go b/src/handler/domains/config.go index 13782b3..a29b12f 100644 --- a/src/handler/domains/config.go +++ b/src/handler/domains/config.go @@ -1,8 +1,6 @@ package domains import ( - "fmt" - "tuxpa.in/t/wm/src/copies" "tuxpa.in/t/wm/src/sock" ) @@ -61,6 +59,6 @@ func (n *Config) parse(msg *sock.Msg) (bool, error) { if msg.HasNext() { return false, &copies.ErrInvalidArgumentCount{Name: "2 or 3", Value: len(msg.Args())} } - return false, fmt.Errorf(`unknown option: '%s'`, arg) + return false, nil } } diff --git a/src/handler/handler.go b/src/handler/handler.go index cf41984..f731a4d 100644 --- a/src/handler/handler.go +++ b/src/handler/handler.go @@ -33,11 +33,11 @@ func (h *Handler) Run(msg *sock.Msg) { if msg.Err(err) { return } - err = msg.Reply(string(resp)) + err = msg.Reply(resp) if msg.Err(err) { return } - msg.Reply("") + msg.Reply(nil) } func (h *Handler) run(msg *sock.Msg) ([]byte, error) { diff --git a/src/sock/msg.go b/src/sock/msg.go index bfad81a..754633e 100644 --- a/src/sock/msg.go +++ b/src/sock/msg.go @@ -56,17 +56,19 @@ func (m *Msg) Err(e error) bool { wr.Flush() return true } -func (m *Msg) Reply(ans string) error { +func (m *Msg) Reply(xs []byte) error { if !m.closed.CompareAndSwap(false, true) { return nil } defer m.c.Close() wr := bufio.NewWriter(m.c) - _, err := wr.Write([]byte(ans)) + _, err := wr.Write(xs) if err != nil { return err } - wr.Write([]byte("\n")) + if len(xs) != 0 { + wr.Write([]byte("\n")) + } wr.Write([]byte{0}) wr.Flush() return nil