summaryrefslogtreecommitdiff
path: root/utils/utils.go
blob: 607236dcd14f326b3cefa14f4682d38498758ba6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package utils

import (
	"crypto/rand"
	"encoding/base64"
	"errors"
	"strconv"
	"strings"
	"time"
)

func GenerateRandomString(len int) (string, error) {
	bin := make([]byte, len)
	_, err := rand.Read(bin)
	if err != nil {
		return "", err
	}
	return base64.StdEncoding.EncodeToString(bin), nil
}

func ParseNumber(s string) (int64, error) {
	s = strings.TrimSpace(s)
	if len(s) == 0 {
		s = "0"
	}

	return strconv.ParseInt(s, 10, 64)
}

func ParseDuration(value string) (time.Duration, error) {
	const nullDuration = time.Duration(0)
	if len(value) == 0 {
		return nullDuration, errors.New("Empty duration string")
	}

	var unit time.Duration
	switch value[len(value)-1] {
	case 's':
		unit = time.Second
	case 'm':
		unit = time.Minute
	case 'h':
		unit = time.Hour
	case 'd':
		unit = time.Duration(24) * time.Hour
	case 'w':
		unit = time.Duration(24*7) * time.Hour
	default:
		return nullDuration, errors.New("Invalid duration format")
	}

	amount, err := strconv.ParseInt(value[0:len(value)-1], 10, 64)
	if err != nil || amount < 0 {
		return nullDuration, errors.New("Invalid duration value")
	}

	return time.Duration(amount) * unit, nil
}