diff --git a/tools/gen_vc.v b/tools/gen_vc.v index 67b0519a3c..06bfe3b5ca 100644 --- a/tools/gen_vc.v +++ b/tools/gen_vc.v @@ -248,8 +248,12 @@ fn (gen_vc mut GenVC) generate() { ts_vc := git_log_vc.find_between('Date:', '\n').trim_space() // parse time as string to time.Time - last_commit_time_v := time.parse(ts_v) - last_commit_time_vc := time.parse(ts_vc) + last_commit_time_v := time.parse(ts_v) or { + panic(err) + } + last_commit_time_vc := time.parse(ts_vc) or { + panic(err) + } // git dates are in users local timezone and v time.parse does not parse // timezones at the moment, so for now get unix timestamp from output also diff --git a/vlib/time/time.v b/vlib/time/time.v index f52ff70013..8cbf7e96c9 100644 --- a/vlib/time/time.v +++ b/vlib/time/time.v @@ -177,24 +177,21 @@ pub fn (t Time) clean12() string { // return fmt.Sprintf("%4d/%02d/%02d", t.Year(), t.Month(), t.Day()) + " " + hm } // `parse` parses time in the following format: "2018-01-27 12:48:34" -pub fn parse(s string) Time { - // println('parse="$s"') +pub fn parse(s string) ?Time { pos := s.index(' ') or { - println('bad time format') - return now() + return error('Invalid time format: $s') } symd := s[..pos] ymd := symd.split('-') if ymd.len != 3 { - println('bad time format') - return now() + return error('Invalid time format: $s') } shms := s[pos..] hms := shms.split(':') hour := hms[0][1..] minute := hms[1] second := hms[2] - // ////////// + return new_time(Time{ year: ymd[0].int() month: ymd[1].int() @@ -206,19 +203,25 @@ pub fn parse(s string) Time { } // `parse_iso` parses time in the following format: "Thu, 12 Dec 2019 06:07:45 GMT" -pub fn parse_iso(s string) Time { +pub fn parse_iso(s string) ?Time { fields := s.split(' ') if fields.len < 5 { - return Time{} + return error('Invalid time format: $s') } pos := months_string.index(fields[2]) or { - return Time{} + return error('Invalid time format: $s') } mm := pos / 3 + 1 tmstr := malloc(s.len * 2) count := C.sprintf(charptr(tmstr), '%s-%02d-%s %s'.str, fields[3].str, mm, fields[1].str, fields[4].str) - return parse(tos(tmstr, count)) + + t := parse(tos(tmstr, count)) or { + // FIXME Remove this when optional forwarding is fixed. + return error('Invalid time format: $s') + } + + return t } pub fn new_time(t Time) Time { diff --git a/vlib/time/time_test.v b/vlib/time/time_test.v index d88a8e90d6..d78a65d488 100644 --- a/vlib/time/time_test.v +++ b/vlib/time/time_test.v @@ -221,23 +221,47 @@ fn test_get_fmt_str() { fn test_parse() { s := '2018-01-27 12:48:34' - t := time.parse(s) + t := time.parse(s) or { + assert false + return + } assert t.year == 2018 && t.month == 1 && t.day == 27 && t.hour == 12 && t.minute == 48 && t.second == 34 assert t.unix == 1517057314 } +fn test_parse_invalid() { + s := 'Invalid time string' + t := time.parse(s) or { + assert true + return + } + assert false +} + fn test_parse_iso() { s1 := 'Thu, 12 Dec 2019 06:07:45 GMT' - t1 := time.parse_iso(s1) + t1 := time.parse_iso(s1) or { + assert false + return + } assert t1.year == 2019 && t1.month == 12 && t1.day == 12 && t1.hour == 6 && t1.minute == 7 && t1.second == 45 assert t1.unix == 1576130865 s2 := 'Thu 12 Dec 2019 06:07:45 +0800' - t2 := time.parse_iso(s2) + t2 := time.parse_iso(s2) or { + assert false + return + } assert t2.year == 2019 && t2.month == 12 && t2.day == 12 && t2.hour == 6 && t2.minute == 7 && t2.second == 45 assert t2.unix == 1576130865 +} + +fn test_parse_iso_invalid() { s3 := 'Thu 12 Foo 2019 06:07:45 +0800' - t3 := time.parse_iso(s3) - assert t3.year == 0 && t3.month == 0 && t3.day == 0 && t3.hour == 0 && t3.minute == 0 && t3.second == 0 + t3 := time.parse_iso(s3) or { + assert true + return + } + assert false } fn test_str() {