-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.go
More file actions
125 lines (108 loc) · 2.64 KB
/
Copy pathclient.go
File metadata and controls
125 lines (108 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package trams
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/http/httputil"
"os"
"strings"
"time"
)
// NewClient returns a new trams client where url is the backend cloud
// function URL and timeout is the timeout in milliseconds for responses.
func NewClient(url string, timeout int) Client {
return Client{url: url, timeout: timeout}
}
// Client is the main API for communicating with the trams backend cloud function.
// TODO: use timeout
type Client struct {
url string
timeout int
}
// Get retrieves information about the specified Metrolink stations.
// If no station IDs is empty retrives all stations.
func (c Client) Get(ids ...string) ([]Metrolink, error) {
query := ""
if len(ids) > 0 {
query += "?id=" + strings.Join([]string(ids), "&id=")
}
resp, err := http.Get(c.url + query)
if err != nil {
return nil, err
}
dump, err := httputil.DumpResponse(resp, true)
if err != nil {
log.Fatal(err)
}
if os.Getenv("TRAMS_DEBUG") == "1" {
fmt.Println("--- Start Response Body (Get)")
fmt.Printf("%q\n", dump)
fmt.Println("--- End Response Body (Get)")
}
var metrolinks []Metrolink
err = json.NewDecoder(resp.Body).Decode(&metrolinks)
if err != nil {
return nil, err
}
return metrolinks, err
}
// List all available station IDs.
func (c Client) List() ([]StationID, error) {
resp, err := http.Get(c.url)
if err != nil {
return nil, err
}
dump, err := httputil.DumpResponse(resp, true)
if err != nil {
log.Fatal(err)
}
if os.Getenv("TRAMS_DEBUG") == "1" {
fmt.Println("--- Start Response Body (List)")
fmt.Printf("%q\n", dump)
fmt.Println("--- End Response Body (List)")
}
var stationIDs []StationID
err = json.NewDecoder(resp.Body).Decode(&stationIDs)
if err != nil {
return nil, err
}
return stationIDs, err
}
// Metrolink provides information for a station location.
type Metrolink struct {
Id int
Line string
TLAREF string
PIDREF string
StationLocation string
AtcoCode string
Direction string
Dest0 string
Carriages0 string
Status0 string
Wait0 string
Dest1 string
Carriages1 string
Status1 string
Wait1 string
Dest2 string
Carriages2 string
Status2 string
Wait2 string
Dest3 string
Carriages3 string
Status3 string
MessageBoard string
Wait3 string
LastUpdated time.Time
}
func (m Metrolink) Platform() string {
return m.PIDREF[len(m.PIDREF)-1:]
}
// StationID identifies a Metrolink station.
type StationID struct {
Id int
TLAREF string
StationLocation string
}