From 3eebdfbe4a6033a0bef0acdaa13061dd830c65d6 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Fri, 14 Aug 2026 19:40:42 +0200 Subject: refactor: split official climb concerns --- official_climb/model.go | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 official_climb/model.go (limited to 'official_climb/model.go') 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 +} -- cgit v1.2.3