From 553966ac87def432af9b32b33be7fa4dee0fa1bb Mon Sep 17 00:00:00 2001 From: Anna Rose Wiggins Date: Fri, 5 Sep 2025 13:42:22 -0400 Subject: [PATCH] Use typed enums for cleaner parsing. --- cmd/joyful/config.go | 5 ++--- internal/configparser/schema.go | 8 ++++---- internal/configparser/variables.go | 28 +++++++++++++++++----------- internal/mappingrules/init_rules.go | 20 ++++++++++---------- internal/mappingrules/variables.go | 12 ------------ 5 files changed, 33 insertions(+), 40 deletions(-) delete mode 100644 internal/mappingrules/variables.go diff --git a/cmd/joyful/config.go b/cmd/joyful/config.go index 2b43380..64d6b2d 100644 --- a/cmd/joyful/config.go +++ b/cmd/joyful/config.go @@ -2,7 +2,6 @@ package main import ( "context" - "strings" "sync" "git.annabunches.net/annabunches/joyful/internal/configparser" @@ -16,7 +15,7 @@ func initPhysicalDevices(conf *configparser.Config) map[string]*evdev.InputDevic pDeviceMap := make(map[string]*evdev.InputDevice) for _, devConfig := range conf.Devices { - if strings.ToLower(devConfig.Type) != configparser.DeviceTypePhysical { + if devConfig.Type != configparser.DeviceTypePhysical { continue } @@ -71,7 +70,7 @@ func initVirtualBuffers(config *configparser.Config) (map[string]*evdev.InputDev vBuffersByDevice := make(map[*evdev.InputDevice]*virtualdevice.EventBuffer) for _, devConfig := range config.Devices { - if strings.ToLower(devConfig.Type) != configparser.DeviceTypeVirtual { + if devConfig.Type != configparser.DeviceTypeVirtual { continue } diff --git a/internal/configparser/schema.go b/internal/configparser/schema.go index 8b70521..2513700 100644 --- a/internal/configparser/schema.go +++ b/internal/configparser/schema.go @@ -15,12 +15,12 @@ type Config struct { // These top-level structs use custom unmarshaling to unpack each available sub-type type DeviceConfig struct { - Type string + Type DeviceType Config interface{} } type RuleConfig struct { - Type string + Type RuleType Name string Modes []string Config interface{} @@ -119,7 +119,7 @@ type RuleTargetConfigModeSelect struct { func (dc *DeviceConfig) UnmarshalYAML(unmarshal func(data interface{}) error) error { metaConfig := &struct { - Type string + Type DeviceType }{} err := unmarshal(metaConfig) if err != nil { @@ -145,7 +145,7 @@ func (dc *DeviceConfig) UnmarshalYAML(unmarshal func(data interface{}) error) er func (dc *RuleConfig) UnmarshalYAML(unmarshal func(data interface{}) error) error { metaConfig := &struct { - Type string + Type RuleType Name string Modes []string }{} diff --git a/internal/configparser/variables.go b/internal/configparser/variables.go index 77e2b9c..1cf3721 100644 --- a/internal/configparser/variables.go +++ b/internal/configparser/variables.go @@ -1,15 +1,21 @@ package configparser -const ( - DeviceTypePhysical = "physical" - DeviceTypeVirtual = "virtual" +type DeviceType string - RuleTypeButton = "button" - RuleTypeButtonCombo = "button-combo" - RuleTypeButtonLatched = "button-latched" - RuleTypeAxis = "axis" - RuleTypeAxisCombined = "axis-combined" - RuleTypeAxisToButton = "axis-to-button" - RuleTypeAxisToRelaxis = "axis-to-relaxis" - RuleTypeModeSelect = "mode-select" +const ( + DeviceTypePhysical DeviceType = "physical" + DeviceTypeVirtual DeviceType = "virtual" +) + +type RuleType string + +const ( + RuleTypeButton RuleType = "button" + RuleTypeButtonCombo RuleType = "button-combo" + RuleTypeButtonLatched RuleType = "button-latched" + RuleTypeAxis RuleType = "axis" + RuleTypeAxisCombined RuleType = "axis-combined" + RuleTypeAxisToButton RuleType = "axis-to-button" + RuleTypeAxisToRelaxis RuleType = "axis-to-relaxis" + RuleTypeModeSelect RuleType = "mode-select" ) diff --git a/internal/mappingrules/init_rules.go b/internal/mappingrules/init_rules.go index 7ea0ea4..f621875 100644 --- a/internal/mappingrules/init_rules.go +++ b/internal/mappingrules/init_rules.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "slices" - "strings" "git.annabunches.net/annabunches/joyful/internal/configparser" "git.annabunches.net/annabunches/joyful/internal/logger" @@ -33,24 +32,25 @@ func NewRule(config configparser.RuleConfig, pDevs map[string]Device, vDevs map[ base := NewMappingRuleBase(config.Name, config.Modes) - switch strings.ToLower(config.Type) { - case RuleTypeButton: + switch config.Type { + case configparser.RuleTypeButton: newRule, err = NewMappingRuleButton(config.Config.(configparser.RuleConfigButton), pDevs, vDevs, base) - case RuleTypeButtonCombo: + case configparser.RuleTypeButtonCombo: newRule, err = NewMappingRuleButtonCombo(config.Config.(configparser.RuleConfigButtonCombo), pDevs, vDevs, base) - case RuleTypeButtonLatched: + case configparser.RuleTypeButtonLatched: newRule, err = NewMappingRuleButtonLatched(config.Config.(configparser.RuleConfigButtonLatched), pDevs, vDevs, base) - case RuleTypeAxis: + case configparser.RuleTypeAxis: newRule, err = NewMappingRuleAxis(config.Config.(configparser.RuleConfigAxis), pDevs, vDevs, base) - case RuleTypeAxisCombined: + case configparser.RuleTypeAxisCombined: newRule, err = NewMappingRuleAxisCombined(config.Config.(configparser.RuleConfigAxisCombined), pDevs, vDevs, base) - case RuleTypeAxisToButton: + case configparser.RuleTypeAxisToButton: newRule, err = NewMappingRuleAxisToButton(config.Config.(configparser.RuleConfigAxisToButton), pDevs, vDevs, base) - case RuleTypeAxisToRelaxis: + case configparser.RuleTypeAxisToRelaxis: newRule, err = NewMappingRuleAxisToRelaxis(config.Config.(configparser.RuleConfigAxisToRelaxis), pDevs, vDevs, base) - case RuleTypeModeSelect: + case configparser.RuleTypeModeSelect: newRule, err = NewMappingRuleModeSelect(config.Config.(configparser.RuleConfigModeSelect), pDevs, modes, base) default: + // Shouldn't actually be possible to get here... err = fmt.Errorf("bad rule type '%s' for rule '%s'", config.Type, config.Name) } diff --git a/internal/mappingrules/variables.go b/internal/mappingrules/variables.go deleted file mode 100644 index d9a171b..0000000 --- a/internal/mappingrules/variables.go +++ /dev/null @@ -1,12 +0,0 @@ -package mappingrules - -const ( - RuleTypeButton = "button" - RuleTypeButtonCombo = "button-combo" - RuleTypeButtonLatched = "button-latched" - RuleTypeAxis = "axis" - RuleTypeAxisCombined = "axis-combined" - RuleTypeAxisToButton = "axis-to-button" - RuleTypeAxisToRelaxis = "axis-to-relaxis" - RuleTypeModeSelect = "mode-select" -)