initial commit

This commit is contained in:
2025-07-25 13:41:23 +02:00
commit 840de62902
27 changed files with 1772 additions and 0 deletions

61
model_position_change.go Normal file
View File

@ -0,0 +1,61 @@
package niri
import (
"encoding/json"
"fmt"
"regexp"
"strconv"
)
type PositionChange struct {
SetFixed Option[int] `json:"SetFixed,omitempty"`
AdjustFixed Option[int] `json:"AdjustFixed,omitempty"`
}
func (m PositionChange) String() string {
data, _ := json.MarshalIndent(m, "", "\t")
return string(data)
}
func PositionSetFixed(position int) PositionChange {
return PositionChange{SetFixed: &position}
}
func PositionAdjustFixed(position int) PositionChange {
return PositionChange{AdjustFixed: &position}
}
const positionPatternString = `^(\+|-)?(\d+?)$`
const positionPatternGroupAdjust = 1
const positionPatternGroupIntValue = 2
var positionPattern = regexp.MustCompile(positionPatternString)
func ParsePosition(str string) (PositionChange, error) {
matches := positionPattern.FindStringSubmatch(str)
if matches == nil {
return PositionChange{}, fmt.Errorf("invalid position spec '%s'. Expected pattern: %s", str, positionPatternString)
}
adjust := matches[positionPatternGroupAdjust] != ""
negative := matches[positionPatternGroupAdjust] == "-"
factor := 1
if negative {
factor = -1
}
intValue, err := strconv.ParseInt(matches[positionPatternGroupIntValue], 10, 64)
if err != nil {
return PositionChange{}, fmt.Errorf("invalid position spec '%s'. Expected pattern: %s", str, positionPatternString)
}
switch true {
case adjust:
return PositionAdjustFixed(int(intValue) * factor), nil
case !adjust:
return PositionSetFixed(int(intValue) * factor), nil
default:
return PositionChange{}, fmt.Errorf("invalid position spec '%s'. Expected pattern: %s", str, positionPatternString)
}
}