penguin/golifehk

@golifehk bot in Telegram

datasources/kmb/query.go

raw ยท 1451 bytes

package kmb

import (
	"fmt"
	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)
	} else {
		qr.Error = fmt.Errorf("unsupported message")
		goto qrReturn
	}

	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
}