Refactor rule generating code and check modes more thoroughly.
This commit is contained in:
parent
102e0808f8
commit
be0a1cf24c
2 changed files with 39 additions and 16 deletions
|
@ -84,6 +84,7 @@ func main() {
|
||||||
|
|
||||||
// initialize the mode variable
|
// initialize the mode variable
|
||||||
mode := config.GetModes()[0]
|
mode := config.GetModes()[0]
|
||||||
|
logger.Logf("Initial mode set to '%s'", mode)
|
||||||
|
|
||||||
fmt.Println("Joyful Running! Press Ctrl+C to quit.")
|
fmt.Println("Joyful Running! Press Ctrl+C to quit.")
|
||||||
for {
|
for {
|
||||||
|
|
|
@ -50,11 +50,27 @@ func (parser *ConfigParser) BuildRules(pDevs map[string]*evdev.InputDevice, vDev
|
||||||
}
|
}
|
||||||
|
|
||||||
func setBaseRuleParameters(ruleConfig RuleConfig, vDevs map[string]*evdev.InputDevice, modes []string) (mappingrules.MappingRuleBase, error) {
|
func setBaseRuleParameters(ruleConfig RuleConfig, vDevs map[string]*evdev.InputDevice, modes []string) (mappingrules.MappingRuleBase, error) {
|
||||||
|
// We perform this check here instead of in makeRuleTarget because only Output targets
|
||||||
|
// can meaningfully have ModeSelect; this lets us avoid plumbing the modes in on every
|
||||||
|
// makeRuleTarget call.
|
||||||
|
if len(ruleConfig.Output.ModeSelect) > 0 {
|
||||||
|
err := validateModes(ruleConfig.Output.ModeSelect, modes)
|
||||||
|
if err != nil {
|
||||||
|
return mappingrules.MappingRuleBase{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
output, err := makeRuleTarget(ruleConfig.Output, vDevs)
|
output, err := makeRuleTarget(ruleConfig.Output, vDevs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mappingrules.MappingRuleBase{}, err
|
return mappingrules.MappingRuleBase{}, err
|
||||||
}
|
}
|
||||||
ruleModes := verifyModes(ruleConfig, modes)
|
|
||||||
|
err = validateModes(ruleConfig.Modes, modes)
|
||||||
|
if err != nil {
|
||||||
|
return mappingrules.MappingRuleBase{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleModes := ensureModes(ruleConfig.Modes)
|
||||||
|
|
||||||
return mappingrules.MappingRuleBase{
|
return mappingrules.MappingRuleBase{
|
||||||
Output: output,
|
Output: output,
|
||||||
|
@ -174,20 +190,26 @@ func decodeRuleTargetValues(target RuleTargetConfig) (evdev.EvType, evdev.EvCode
|
||||||
return eventType, eventCode, nil
|
return eventType, eventCode, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyModes(ruleConfig RuleConfig, modes []string) []string {
|
// ensureModes either returns the mode list, or if it is empty returns []string{"*"}
|
||||||
verifiedModes := make([]string, 0)
|
func ensureModes(modes []string) []string {
|
||||||
|
if len(modes) == 0 {
|
||||||
for _, configMode := range ruleConfig.Modes {
|
return []string{"*"}
|
||||||
if !slices.Contains(modes, configMode) {
|
|
||||||
logger.Logf("rule '%s' specifies undefined mode '%s', skipping", ruleConfig.Name, configMode)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
verifiedModes = append(verifiedModes, configMode)
|
|
||||||
}
|
}
|
||||||
if len(verifiedModes) == 0 {
|
return modes
|
||||||
verifiedModes = []string{"*"}
|
}
|
||||||
}
|
|
||||||
|
// validateModes checks the provided modes against a larger subset of modes (usually all defined ones)
|
||||||
return verifiedModes
|
// and returns an error if any of the modes are not defined.
|
||||||
|
func validateModes(modes []string, allModes []string) error {
|
||||||
|
if len(modes) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, mode := range modes {
|
||||||
|
if !slices.Contains(allModes, mode) {
|
||||||
|
return fmt.Errorf("mode list specifies undefined mode '%s'", mode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue