forked from blockwatch-cc/tzgo
/
variables.go
101 lines (90 loc) · 1.97 KB
/
variables.go
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright (c) 2023 Blockwatch Data Inc.
// Author: alex@blockwatch.cc, abdul@blockwatch.cc
package compose
import (
"fmt"
"regexp"
"strconv"
"strings"
"time"
)
const (
VAR_PREFIX = "$"
FILE_PREFIX = "@"
TIME_PREFIX = "$now"
)
var NESTED_VAR = regexp.MustCompile(`\$[a-zA-Z0-9_-]+`)
func (c Context) ResolveNestedVars(src string) (string, bool) {
if NESTED_VAR.MatchString(src) {
return NESTED_VAR.ReplaceAllStringFunc(src, func(v string) string {
if val, ok := c.Variables[v]; ok {
return val
}
return v
}), true
}
return src, false
}
func CreateVariable(v string) string {
if IsVariable(v) {
return v
}
return VAR_PREFIX + v
}
func IsVariable(v string) bool {
return strings.HasPrefix(v, VAR_PREFIX)
}
func IsTimeExpression(v string) bool {
return strings.HasPrefix(v, TIME_PREFIX)
}
func IsFile(v string) bool {
return strings.HasPrefix(v, FILE_PREFIX)
}
func ConvertTime(v string) (string, error) {
if IsTimeExpression(v) {
v = strings.TrimPrefix(v, "$now")
t := time.Now().UTC()
if len(v) == 0 {
return t.Format(time.RFC3339), nil
}
switch v[0] {
case '-':
d, err := time.ParseDuration(v[1:])
if err != nil {
return "", err
}
return t.Add(-d).Format(time.RFC3339), nil
case '+':
d, err := time.ParseDuration(v[1:])
if err != nil {
return "", err
}
return t.Add(d).Format(time.RFC3339), nil
default:
return "", fmt.Errorf("invalid time offset")
}
}
t, err := ParseTime(v)
if err != nil {
return "", err
}
return t.Format(time.RFC3339), nil
}
func ParseTime(v string) (time.Time, error) {
if i, err := strconv.ParseInt(v, 10, 64); err == nil {
return time.Unix(i, 0), nil
}
for _, f := range []string{
time.RFC3339,
time.RFC3339Nano,
"2006-01-02T15:04:05.999999999Z",
"2006-01-02T15:04:05Z",
"2006-01-02T15:04:05.999999999",
"2006-01-02T15:04:05",
} {
if t, err := time.Parse(f, v); err == nil {
return t.UTC(), nil
}
}
return time.Time{}, fmt.Errorf("invalid time format")
}