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
 | 
						|
}
 |