diff --git a/src/statusscreen/SL.go b/src/statusscreen/SL.go index 9e56cf2..7c7f133 100644 --- a/src/statusscreen/SL.go +++ b/src/statusscreen/SL.go @@ -3,6 +3,7 @@ package statusscreen import ( "bytes" "encoding/json" + "errors" "fmt" "github.com/olekukonko/tablewriter" "io/ioutil" @@ -71,10 +72,12 @@ func (sl *SL) GetOutput() string { } for _, v := range sl.lastResponse.ResponseData.Metros { + formattedTime, _ := sl.formatDisplayTime(v.ExpectedDateTime) + table.Append([]string{ v.LineNumber, v.Destination, - sl.formatDisplayTime(v.ExpectedDateTime), + formattedTime, v.TimeTabledDateTime[11:], // Remove YYYY-MM-DDT from the beginning of the string v.ExpectedDateTime[11:], // Remove YYYY-MM-DDT from the beginning of the string }) @@ -117,7 +120,7 @@ func (sl *SL) getTimeTable() (SLResponse, error) { return parsedResponse, nil } -func (sl *SL) formatDisplayTime(expected string) string { +func (sl *SL) formatDisplayTime(expected string) (string, error) { myTimeZone, _ := time.Now().Zone() then, err := time.Parse("2006-01-02T15:04:05 MST", expected+" "+myTimeZone) @@ -127,13 +130,21 @@ func (sl *SL) formatDisplayTime(expected string) string { timeLeft := time.Since(then).Seconds() * -1 + // If time is less than zero + if timeLeft < 0 { + return "undefined", errors.New("Train is gone already") + } + + // If time is less than one minute, show seconds if timeLeft <= 60 && timeLeft > 0 { - return fmt.Sprintf("%d sec", int(timeLeft)) + return fmt.Sprintf("%d sec", int(timeLeft)), nil } + // If time is less than one hour, show minutes if timeLeft <= 3600 && timeLeft > 0 { - return fmt.Sprintf("%d min", int(timeLeft)/60) + return fmt.Sprintf("%d min", int(timeLeft)/60), nil } - return fmt.Sprintf("%02d:%02d:%02d", then.Hour(), then.Minute(), then.Second()) + // Otherwise, just return a timestamp: HH:MM:SS + return fmt.Sprintf("%02d:%02d:%02d", then.Hour(), then.Minute(), then.Second()), nil }