gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

rate.go (1013B)


      1 package limiter
      2 
      3 import (
      4 	"strconv"
      5 	"strings"
      6 	"time"
      7 
      8 	"github.com/pkg/errors"
      9 )
     10 
     11 // Rate is the rate.
     12 type Rate struct {
     13 	Formatted string
     14 	Period    time.Duration
     15 	Limit     int64
     16 }
     17 
     18 // NewRateFromFormatted returns the rate from the formatted version.
     19 func NewRateFromFormatted(formatted string) (Rate, error) {
     20 	rate := Rate{}
     21 
     22 	values := strings.Split(formatted, "-")
     23 	if len(values) != 2 {
     24 		return rate, errors.Errorf("incorrect format '%s'", formatted)
     25 	}
     26 
     27 	periods := map[string]time.Duration{
     28 		"S": time.Second,    // Second
     29 		"M": time.Minute,    // Minute
     30 		"H": time.Hour,      // Hour
     31 		"D": time.Hour * 24, // Day
     32 	}
     33 
     34 	limit, period := values[0], strings.ToUpper(values[1])
     35 
     36 	p, ok := periods[period]
     37 	if !ok {
     38 		return rate, errors.Errorf("incorrect period '%s'", period)
     39 	}
     40 
     41 	l, err := strconv.ParseInt(limit, 10, 64)
     42 	if err != nil {
     43 		return rate, errors.Errorf("incorrect limit '%s'", limit)
     44 	}
     45 
     46 	rate = Rate{
     47 		Formatted: formatted,
     48 		Period:    p,
     49 		Limit:     l,
     50 	}
     51 
     52 	return rate, nil
     53 }