-
-
Notifications
You must be signed in to change notification settings - Fork 23
/
parse_time_delta.go
79 lines (69 loc) · 2.52 KB
/
parse_time_delta.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
// Code generated by __generator__/interpreter.go at once
package builtin
import (
"strconv"
"github.com/ysugimoto/falco/interpreter/context"
"github.com/ysugimoto/falco/interpreter/function/errors"
"github.com/ysugimoto/falco/interpreter/value"
)
const Parse_time_delta_Name = "parse_time_delta"
var Parse_time_delta_ArgumentTypes = []value.Type{value.StringType}
func Parse_time_delta_Validate(args []value.Value) error {
if len(args) != 1 {
return errors.ArgumentNotEnough(Parse_time_delta_Name, 1, args)
}
for i := range args {
if args[i].Type() != Parse_time_delta_ArgumentTypes[i] {
return errors.TypeMismatch(Parse_time_delta_Name, i+1, Parse_time_delta_ArgumentTypes[i], args[i].Type())
}
}
return nil
}
// Fastly built-in function implementation of parse_time_delta
// Arguments may be:
// - STRING
// Reference: https://developer.fastly.com/reference/vcl/functions/date-and-time/parse-time-delta/
func Parse_time_delta(ctx *context.Context, args ...value.Value) (value.Value, error) {
// Argument validations
if err := Parse_time_delta_Validate(args); err != nil {
return value.Null, err
}
specifier := value.Unwrap[*value.String](args[0])
var delta int64
var stack []byte
// Golang's time.ParseDuration does not recognize "d" and "D", date duration so we need to parse manually
for _, s := range []byte(specifier.Value) {
switch s {
case 0x64, 0x44: // "d" or "D"
v, err := strconv.ParseInt(string(stack), 10, 64)
if err != nil {
return value.Null, errors.New(Parse_time_delta_Name, "Failed to parse dates as int: %s", string(stack))
}
delta += v * 24 * 60 * 60
case 0x68, 0x48: // "h" or "H"
v, err := strconv.ParseInt(string(stack), 10, 64)
if err != nil {
return value.Null, errors.New(Parse_time_delta_Name, "Failed to parse hours as int: %s", string(stack))
}
delta += v * 60 * 60
case 0x6D, 0x4D: // "m" or "M"
v, err := strconv.ParseInt(string(stack), 10, 64)
if err != nil {
return value.Null, errors.New(Parse_time_delta_Name, "Failed to parse minutes as int: %s", string(stack))
}
delta += v * 60
case 0x73, 0x53: // "s" or "S"
v, err := strconv.ParseInt(string(stack), 10, 64)
if err != nil {
return value.Null, errors.New(Parse_time_delta_Name, "Failed to parse seconds as int: %s", string(stack))
}
delta += v
default:
if s < 0x30 || s > 0x39 {
return value.Null, errors.New(Parse_time_delta_Name, "Invalid character found: %s", string([]byte{s}))
}
stack = append(stack, s)
}
}
return &value.Integer{Value: delta}, nil
}