42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
|
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
|
||
|
}
|