package main import ( "errors" "regexp" "strconv" "time" log "github.com/sirupsen/logrus" ) func Expiration(now time.Time, deadline string) (time.Time, error) { log.WithFields(log.Fields{"now": now, "deadline": deadline}).Debugf("starting") defer log.WithFields(log.Fields{"now": now, "deadline": deadline}).Debugf("done") if deadline == "forever" { return time.Unix(1<<63-1, 0), nil } reExpiration := regexp.MustCompile(`([0-9]+)([a-z]+)`) for _, v := range reExpiration.FindAllStringSubmatch(deadline, -1) { log.WithFields(log.Fields{"now": now, "deadline": deadline}).Debugf("duration[%d] : %v", len(v), v) count, _ := strconv.Atoi(v[1]) switch v[2] { case "y": now = now.AddDate(count, 0, 0) case "m": now = now.AddDate(0, count, 0) case "d": now = now.AddDate(0, 0, count) case "h": now = now.Add(time.Duration(time.Duration(count) * time.Hour)) default: err := errors.New("invalid duration") log.WithFields(log.Fields{"now": now, "deadline": deadline, "attr": v[2], "error": err}).Errorf("") return time.Now(), err } } return now, nil }