112 lines
2.3 KiB
Go
112 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
type Departure struct {
|
|
TripID int
|
|
RealtimeTripId string
|
|
StopHeadsign string
|
|
ArrivalTime time.Time
|
|
DepartureTime time.Time
|
|
RouteShortName string
|
|
}
|
|
|
|
type ResponseDeparture struct {
|
|
TripID int `json:"trip_id"`
|
|
RealtimeTripId string `json:"realtime_trip_id"`
|
|
StopHeadsign string `json:"stop_headsign"`
|
|
ArrivalTime string `json:"arrival_time"`
|
|
DepartureTime string `json:"departure_time"`
|
|
Tripdata struct {
|
|
Route struct {
|
|
RouteShortName string `json:"route_short_name"`
|
|
} `json:"route"`
|
|
} `json:"tripdata"`
|
|
}
|
|
|
|
// ToDeparture transforms the ResponseDeparture struct to a Departure.
|
|
func (rd ResponseDeparture) ToDeparture() (Departure, error) {
|
|
var departure Departure
|
|
|
|
departure.TripID = rd.TripID
|
|
departure.RealtimeTripId = rd.RealtimeTripId
|
|
departure.StopHeadsign = rd.StopHeadsign
|
|
departure.RouteShortName = rd.Tripdata.Route.RouteShortName
|
|
|
|
_time, err := parseUnixTimestamp(rd.ArrivalTime)
|
|
if err != nil {
|
|
return departure, err
|
|
}
|
|
departure.ArrivalTime = _time
|
|
|
|
_time, err = parseUnixTimestamp(rd.DepartureTime)
|
|
if err != nil {
|
|
return departure, err
|
|
}
|
|
departure.DepartureTime = _time
|
|
|
|
return departure, nil
|
|
}
|
|
|
|
type QueryResponse struct {
|
|
Results []struct {
|
|
Departures []ResponseDeparture `json:"departures"`
|
|
} `json:"results"`
|
|
}
|
|
|
|
func getDepartures(quay Quay) ([]Departure, error) {
|
|
var stop string
|
|
var uri string
|
|
var data QueryResponse
|
|
var departures []Departure
|
|
|
|
q, err := json.Marshal(quay)
|
|
if err != nil {
|
|
return departures, err
|
|
}
|
|
|
|
stop = string(q)
|
|
uri = fmt.Sprintf("https://www.breng.nl/api/travelplanner/quays/departures?stop=%s", url.QueryEscape(stop))
|
|
|
|
req, err := http.NewRequest("GET", uri, nil)
|
|
if err != nil {
|
|
return departures, err
|
|
}
|
|
|
|
resp, err := BusClient.Do(req)
|
|
if err != nil {
|
|
return departures, err
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return departures, err
|
|
}
|
|
|
|
err = json.Unmarshal(body, &data)
|
|
if err != nil {
|
|
return departures, err
|
|
}
|
|
|
|
for _, r := range data.Results {
|
|
for _, rd := range r.Departures {
|
|
d, err := rd.ToDeparture()
|
|
if err != nil {
|
|
return departures, err
|
|
}
|
|
departures = append(departures, d)
|
|
}
|
|
}
|
|
|
|
return departures, nil
|
|
}
|