package sorting import ( "cmp" "encoding/json" "strings" "git.coopgo.io/coopgo-platform/fleets/storage" fleetsstorage "git.coopgo.io/coopgo-platform/fleets/storage" "github.com/paulmach/orb/geo" "github.com/paulmach/orb/geojson" "github.com/rs/zerolog/log" ) type VehiclesByLicencePlate []fleetsstorage.Vehicle func (a VehiclesByLicencePlate) Len() int { return len(a) } func (a VehiclesByLicencePlate) Less(i, j int) bool { return strings.Compare(a[i].Data["licence_plate"].(string), a[j].Data["licence_plate"].(string)) < 0 } func (a VehiclesByLicencePlate) Swap(i, j int) { a[i], a[j] = a[j], a[i] } type BookingsByStartdate []fleetsstorage.Booking func (a BookingsByStartdate) Len() int { return len(a) } func (a BookingsByStartdate) Less(i, j int) bool { return a[i].Startdate.Before(a[j].Startdate) } func (a BookingsByStartdate) Swap(i, j int) { a[i], a[j] = a[j], a[i] } // Functions func VehiclesByDistanceFrom(from geojson.Feature) func(vehicle1, vehicle2 storage.Vehicle) int { return func(vehicle1, vehicle2 storage.Vehicle) int { vehicle1Address, ok := vehicle1.Data["address"] if !ok { return 1 } vehicle1Json, err := json.Marshal(vehicle1Address) if err != nil { log.Error().Err(err).Msg("failed marshalling vehicle 1 json") return 1 } vehicle1Geojson, err := geojson.UnmarshalFeature(vehicle1Json) if err != nil { log.Error().Err(err).Msg("failed unmarshalling vehicle 1 geojson") return 1 } vehicle2Address, ok := vehicle2.Data["address"] if !ok { log.Debug().Msg("Vehicle 2 does not have an address") return -1 } vehicle2Json, err := json.Marshal(vehicle2Address) if err != nil { log.Error().Err(err).Msg("failed marshalling vehicle 2 json") return -1 } vehicle2Geojson, err := geojson.UnmarshalFeature(vehicle2Json) if err != nil { log.Error().Err(err).Msg("failed unmarshalling vehicle 2 geojson") return -1 } distance1 := geo.Distance(from.Point(), vehicle1Geojson.Point()) distance2 := geo.Distance(from.Point(), vehicle2Geojson.Point()) return cmp.Compare(distance1, distance2) } }