Files
golifehk/datasources/kmb/query.go
2026-03-10 15:18:34 +08:00

81 lines
1.3 KiB
Go

package kmb
import (
query "github.com/tgckpg/golifehk/query"
"log"
"strings"
)
func Query(q query.QueryMessage) query.IQueryResult {
lang := q.Lang
var qo *query.QueryObject
var err error
var routeStops *[]query.ISearchable
qr := QueryResult{
Lang: lang,
FallbackNearest: 3,
NearestRange: 50,
}
busStops, err := readBusStopsData()
if err != nil {
qr.Error = err
goto qrReturn
}
routeStops, err = getRouteStops(busStops)
if err != nil {
qr.Error = err
goto qrReturn
}
if q.Text != "" {
qo, err = query.MatchKeys(strings.ToUpper(q.Text), routeStops)
} else if q.Location != nil {
bList := []query.ISearchable{}
for _, b := range *busStops {
bList = append(bList, b)
}
qo, err = query.MatchNearest(*q.Location, &bList, qr.NearestRange, qr.FallbackNearest)
}
qo.Message = &q
if err != nil {
qr.Error = err
goto qrReturn
}
qr.Query = qo
if 0 < len(*qo.Results) && 1 < len(*qo.SearchTerms) {
rSchedules := map[*RouteStop]*[]*Schedule{}
for _, item := range *qo.Results {
var r *RouteStop
r = any(item).(*RouteStop)
schedules, err := getSchedule(r)
if err != nil {
qr.Error = err
break
}
rSchedules[r] = schedules
}
qr.Schedules = &rSchedules
}
qrReturn:
if qr.Error != nil {
log.Println(qr.Error)
}
var iqr query.IQueryResult
iqr = &qr
return iqr
}