diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-08-14 19:40:42 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-08-14 19:40:42 +0200 |
| commit | 3eebdfbe4a6033a0bef0acdaa13061dd830c65d6 (patch) | |
| tree | 498d450b4a722793bb3d3efebfdd9224f7252a08 /official_climb/model.go | |
| parent | eac1145e29e1a2a2ff5d9654ca010071a5840843 (diff) | |
refactor: split official climb concerns
Diffstat (limited to 'official_climb/model.go')
| -rw-r--r-- | official_climb/model.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/official_climb/model.go b/official_climb/model.go new file mode 100644 index 0000000..ae66f46 --- /dev/null +++ b/official_climb/model.go @@ -0,0 +1,50 @@ +package official_climb + +import ( + "fmt" + "math" + "strings" + "time" + + "github.com/jftuga/geodist" +) + +const DefaultMatchRadiusM = 100.0 + +type OfficialClimb struct { + ID int64 + Name string + StartCoord geodist.Coord + EndCoord geodist.Coord + CreatedAt time.Time + UpdatedAt time.Time +} + +type MatchPolicy struct { + EndpointRadiusM float64 +} + +func DefaultMatchPolicy() MatchPolicy { + return MatchPolicy{EndpointRadiusM: DefaultMatchRadiusM} +} + +func (policy MatchPolicy) Validate() error { + if math.IsNaN(policy.EndpointRadiusM) || math.IsInf(policy.EndpointRadiusM, 0) || policy.EndpointRadiusM <= 0 { + return fmt.Errorf("official climb endpoint radius must be greater than zero") + } + return nil +} + +func (climb OfficialClimb) validate() error { + if strings.TrimSpace(climb.Name) == "" { + return fmt.Errorf("official climb name is required") + } + if !validCoord(climb.StartCoord) || !validCoord(climb.EndCoord) { + return fmt.Errorf("official climb coordinates are invalid") + } + return nil +} + +func validCoord(coord geodist.Coord) bool { + return coord.Lat >= -90 && coord.Lat <= 90 && coord.Lon >= -180 && coord.Lon <= 180 +} |