initial commit
This commit is contained in:
		
							
								
								
									
										61
									
								
								model_position_change.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								model_position_change.go
									
									
									
									
									
										Normal 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) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user