]>
Commit | Line | Data |
---|---|---|
107c1cdb ND |
1 | package funcs |
2 | ||
3 | import ( | |
4 | "time" | |
5 | ||
6 | "github.com/zclconf/go-cty/cty" | |
7 | "github.com/zclconf/go-cty/cty/function" | |
8 | ) | |
9 | ||
10 | // TimestampFunc constructs a function that returns a string representation of the current date and time. | |
11 | var TimestampFunc = function.New(&function.Spec{ | |
12 | Params: []function.Parameter{}, | |
13 | Type: function.StaticReturnType(cty.String), | |
14 | Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { | |
15 | return cty.StringVal(time.Now().UTC().Format(time.RFC3339)), nil | |
16 | }, | |
17 | }) | |
18 | ||
19 | // TimeAddFunc constructs a function that adds a duration to a timestamp, returning a new timestamp. | |
20 | var TimeAddFunc = function.New(&function.Spec{ | |
21 | Params: []function.Parameter{ | |
22 | { | |
23 | Name: "timestamp", | |
24 | Type: cty.String, | |
25 | }, | |
26 | { | |
27 | Name: "duration", | |
28 | Type: cty.String, | |
29 | }, | |
30 | }, | |
31 | Type: function.StaticReturnType(cty.String), | |
32 | Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { | |
33 | ts, err := time.Parse(time.RFC3339, args[0].AsString()) | |
34 | if err != nil { | |
35 | return cty.UnknownVal(cty.String), err | |
36 | } | |
37 | duration, err := time.ParseDuration(args[1].AsString()) | |
38 | if err != nil { | |
39 | return cty.UnknownVal(cty.String), err | |
40 | } | |
41 | ||
42 | return cty.StringVal(ts.Add(duration).Format(time.RFC3339)), nil | |
43 | }, | |
44 | }) | |
45 | ||
46 | // Timestamp returns a string representation of the current date and time. | |
47 | // | |
48 | // In the Terraform language, timestamps are conventionally represented as | |
49 | // strings using RFC 3339 "Date and Time format" syntax, and so timestamp | |
50 | // returns a string in this format. | |
51 | func Timestamp() (cty.Value, error) { | |
52 | return TimestampFunc.Call([]cty.Value{}) | |
53 | } | |
54 | ||
55 | // TimeAdd adds a duration to a timestamp, returning a new timestamp. | |
56 | // | |
57 | // In the Terraform language, timestamps are conventionally represented as | |
58 | // strings using RFC 3339 "Date and Time format" syntax. Timeadd requires | |
59 | // the timestamp argument to be a string conforming to this syntax. | |
60 | // | |
61 | // `duration` is a string representation of a time difference, consisting of | |
62 | // sequences of number and unit pairs, like `"1.5h"` or `1h30m`. The accepted | |
63 | // units are `ns`, `us` (or `µs`), `"ms"`, `"s"`, `"m"`, and `"h"`. The first | |
64 | // number may be negative to indicate a negative duration, like `"-2h5m"`. | |
65 | // | |
66 | // The result is a string, also in RFC 3339 format, representing the result | |
67 | // of adding the given direction to the given timestamp. | |
68 | func TimeAdd(timestamp cty.Value, duration cty.Value) (cty.Value, error) { | |
69 | return TimeAddFunc.Call([]cty.Value{timestamp, duration}) | |
70 | } |