149 lines
4.1 KiB
Go
149 lines
4.1 KiB
Go
package bus
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
query "github.com/tgckpg/golifehk/query"
|
|
utils "github.com/tgckpg/golifehk/utils"
|
|
)
|
|
|
|
type QueryResult struct {
|
|
Schedules *map[*BusStop] *BusStopBuses
|
|
Lang string
|
|
Error error
|
|
Query *query.QueryObject
|
|
}
|
|
|
|
func writeShortRoute( lang *string, sb *strings.Builder, b *BusStop ) {
|
|
if b.PrevStop() != nil {
|
|
utils.WriteMDv2Text( sb, (*b.PrevStop().Name)[ *lang ] )
|
|
sb.WriteString( " \\> " )
|
|
}
|
|
|
|
sb.WriteString( "*" )
|
|
utils.WriteMDv2Text( sb, (*b.Name)[ *lang ] )
|
|
sb.WriteString( "*" )
|
|
|
|
if b.NextStop() != nil {
|
|
sb.WriteString( " \\> " )
|
|
utils.WriteMDv2Text( sb, (*b.NextStop().Name)[ *lang ] )
|
|
}
|
|
|
|
sb.WriteString( "\n" )
|
|
}
|
|
|
|
func ( this QueryResult ) Message() ( string, error ) {
|
|
|
|
if this.Error != nil {
|
|
return "", this.Error
|
|
}
|
|
|
|
sb := strings.Builder{}
|
|
|
|
if this.Schedules == nil {
|
|
|
|
q := *this.Query
|
|
|
|
if len( *q.Results ) == 0 {
|
|
terms := make( []string, len(*q.SearchTerms), len(*q.SearchTerms) )
|
|
for i, term := range *q.SearchTerms {
|
|
terms[i] = term.Org
|
|
}
|
|
return "", fmt.Errorf( "Not Found: \"%s\"", strings.Join( terms, "\", \"" ) )
|
|
}
|
|
|
|
if q.Key == "" {
|
|
sort.Sort( query.ByKey( *q.Results ) )
|
|
for _, entry := range *q.Results {
|
|
busStop := any( entry ).( *BusStop )
|
|
utils.WriteMDv2Text( &sb, busStop.RouteId )
|
|
sb.WriteString( " " )
|
|
writeShortRoute( &this.Lang, &sb, busStop )
|
|
}
|
|
} else if 1 == len( *q.SearchTerms ) {
|
|
|
|
// Route listing
|
|
st := map[string] *BusStop{}
|
|
keys := [] string{}
|
|
|
|
for _, entry := range *q.Results {
|
|
|
|
busStop := any( entry ).( *BusStop )
|
|
if _, ok := st[ busStop.Direction ]; ok {
|
|
continue
|
|
}
|
|
|
|
st[ busStop.Direction ] = busStop
|
|
keys = append( keys, busStop.Direction )
|
|
|
|
for st[ busStop.Direction ].PrevStop() != nil {
|
|
st[ busStop.Direction ] = st[ busStop.Direction ].PrevStop()
|
|
}
|
|
}
|
|
|
|
sort.Strings( keys )
|
|
|
|
for _, d := range keys {
|
|
b := st[ d ]
|
|
utils.WriteMDv2Text( &sb, q.Key )
|
|
|
|
if d == "O" {
|
|
sb.WriteString( "↑" )
|
|
} else if d == "I" {
|
|
sb.WriteString( "↓" )
|
|
} else {
|
|
sb.WriteString( "\\?" )
|
|
}
|
|
sb.WriteString( "\n " )
|
|
|
|
for {
|
|
utils.WriteMDv2Text( &sb, (*b.Name)[ this.Lang ] )
|
|
b = b.NextStop()
|
|
if b == nil {
|
|
break
|
|
}
|
|
|
|
sb.WriteString( " \\> " )
|
|
}
|
|
sb.WriteString( "\n" )
|
|
}
|
|
|
|
} else {
|
|
return "", fmt.Errorf( "%s", "Unreachable condition occured!?" )
|
|
}
|
|
} else {
|
|
if 0 < len( *this.Schedules ) {
|
|
|
|
busStops := [] *BusStop{}
|
|
|
|
for b, _ := range *this.Schedules {
|
|
busStops = append( busStops, b )
|
|
}
|
|
|
|
sort.Sort( ByRoute( busStops ) )
|
|
|
|
for _, busStop := range busStops {
|
|
buses := (*this.Schedules)[ busStop ]
|
|
|
|
writeShortRoute( &this.Lang, &sb, busStop )
|
|
for _, bus := range buses.Buses {
|
|
sb.WriteString( " \\* " )
|
|
if bus.ETAText == "" {
|
|
utils.WriteMDv2Text( &sb, bus.ETDText )
|
|
} else {
|
|
utils.WriteMDv2Text( &sb, bus.ETAText )
|
|
}
|
|
sb.WriteString( "\n" )
|
|
}
|
|
sb.WriteString( "\n" )
|
|
}
|
|
} else {
|
|
utils.WriteMDv2Text( &sb, "Schedules are empty...perhaps Out of Service Time?" )
|
|
}
|
|
}
|
|
|
|
return sb.String(), nil
|
|
}
|