// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved. // Use of this source code is governed by an MIT license // that can be found in the LICENSE file. module time // parse returns time from a date string in "YYYY-MM-DD HH:MM:SS" format. pub fn parse(s string) ?Time { pos := s.index(' ') or { return error('Invalid time format: $s') } symd := s[..pos] ymd := symd.split('-') if ymd.len != 3 { return error('Invalid time format: $s') } shms := s[pos..] hms := shms.split(':') hour := hms[0][1..] minute := hms[1] second := hms[2] res := new_time(Time{ year: ymd[0].int() month: ymd[1].int() day: ymd[2].int() hour: hour.int() minute: minute.int() second: second.int() }) return res } // parse_rfc2822 returns time from a date string in RFC 2822 datetime format. pub fn parse_rfc2822(s string) ?Time { fields := s.split(' ') if fields.len < 5 { return error('Invalid time format: $s') } pos := months_string.index(fields[2]) or { return error('Invalid time format: $s') } mm := pos / 3 + 1 mut tmstr := byteptr(0) unsafe { 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) t := parse(tos(tmstr, count)) or { // FIXME Remove this when optional forwarding is fixed. return error('Invalid time format: $s') } return t }