summaryrefslogtreecommitdiff
path: root/official_climb/model.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-14 19:40:42 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-14 19:40:42 +0200
commit3eebdfbe4a6033a0bef0acdaa13061dd830c65d6 (patch)
tree498d450b4a722793bb3d3efebfdd9224f7252a08 /official_climb/model.go
parenteac1145e29e1a2a2ff5d9654ca010071a5840843 (diff)
refactor: split official climb concerns
Diffstat (limited to 'official_climb/model.go')
-rw-r--r--official_climb/model.go50
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
+}