diff --git a/decode.go b/decode.go index e34039e4..6b553578 100644 --- a/decode.go +++ b/decode.go @@ -43,6 +43,13 @@ func parseLocalDate(b []byte) (LocalDate, error) { date.Day = parseDecimalDigits(b[8:10]) + dateString := fmt.Sprintf("%04d-%02d-%02d", + date.Year, date.Month, date.Day) + _, err := time.Parse("2006-01-02", dateString) + if err != nil { + return LocalDate{}, newDecodeError(b, "invalid local date") + } + return date, nil } @@ -144,6 +151,13 @@ func parseLocalDateTime(b []byte) (LocalDateTime, []byte, error) { } dt.LocalTime = t + localDateTimeString := fmt.Sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", + dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second) + _, err = time.Parse(time.RFC3339, localDateTimeString) + if err != nil { + return LocalDateTime{}, rest, newDecodeError(b, "invalid local date-time") + } + return dt, rest, nil } @@ -202,6 +216,13 @@ func parseLocalTime(b []byte) (LocalTime, []byte, error) { return t, b[9+digits:], nil } + localTimeString := fmt.Sprintf("%02d:%02d:%02d", + t.Hour, t.Minute, t.Second) + _, err := time.Parse("15:04:05", localTimeString) + if err != nil { + return LocalTime{}, b, newDecodeError(b, "invalid local time") + } + return t, b[8:], nil }