@@ -94,6 +94,7 @@ var stdlibFunctions = []funcDef{
9494 {name : "replace" , fn : stdlib .ReplaceFunc },
9595 {name : "reverse" , fn : stdlib .ReverseFunc },
9696 {name : "reverselist" , fn : stdlib .ReverseListFunc },
97+ {name : "rfc3339parse" , factory : rfc3339ParseFunc },
9798 {name : "rsadecrypt" , fn : crypto .RsaDecryptFunc },
9899 {name : "sanitize" , factory : sanitizeFunc },
99100 {name : "sethaselement" , fn : stdlib .SetHasElementFunc },
@@ -237,7 +238,7 @@ func sanitizeFunc() function.Function {
237238
238239// timestampFunc constructs a function that returns a string representation of the current date and time.
239240//
240- // This function was imported from terraform 's datetime utilities.
241+ // This function was imported from Terraform 's datetime utilities.
241242func timestampFunc () function.Function {
242243 return function .New (& function.Spec {
243244 Params : []function.Parameter {},
@@ -248,6 +249,61 @@ func timestampFunc() function.Function {
248249 })
249250}
250251
252+ // rfc3339ParseFunc, given an RFC3339 timestamp string, will parse and return an
253+ // object representation of that date and time.
254+ //
255+ // This function is similar to the `rfc3339_parse` function in Terraform:
256+ // https://registry.terraform.io/providers/hashicorp/time/latest/docs/functions/rfc3339_parse
257+ func rfc3339ParseFunc () function.Function {
258+ return function .New (& function.Spec {
259+ Params : []function.Parameter {
260+ {
261+ Name : "timestamp" ,
262+ Description : "RFC3339 timestamp string to parse" ,
263+ Type : cty .String ,
264+ },
265+ },
266+ Type : function .StaticReturnType (cty .Object (map [string ]cty.Type {
267+ "year" : cty .Number ,
268+ "year_day" : cty .Number ,
269+ "day" : cty .Number ,
270+ "month" : cty .Number ,
271+ "month_name" : cty .String ,
272+ "weekday" : cty .Number ,
273+ "weekday_name" : cty .String ,
274+ "hour" : cty .Number ,
275+ "minute" : cty .Number ,
276+ "second" : cty .Number ,
277+ "unix" : cty .Number ,
278+ "iso_year" : cty .Number ,
279+ "iso_week" : cty .Number ,
280+ })),
281+ Impl : func (args []cty.Value , retType cty.Type ) (cty.Value , error ) {
282+ ts := args [0 ].AsString ()
283+ rfc3339 , err := time .Parse (time .RFC3339 , ts )
284+ if err != nil {
285+ return cty .NilVal , err
286+ }
287+ isoYear , isoWeek := rfc3339 .ISOWeek ()
288+ return cty .ObjectVal (map [string ]cty.Value {
289+ "year" : cty .NumberIntVal (int64 (rfc3339 .Year ())),
290+ "year_day" : cty .NumberIntVal (int64 (rfc3339 .YearDay ())),
291+ "day" : cty .NumberIntVal (int64 (rfc3339 .Day ())),
292+ "month" : cty .NumberIntVal (int64 (rfc3339 .Month ())),
293+ "month_name" : cty .StringVal (rfc3339 .Month ().String ()),
294+ "weekday" : cty .NumberIntVal (int64 (rfc3339 .Weekday ())),
295+ "weekday_name" : cty .StringVal (rfc3339 .Weekday ().String ()),
296+ "hour" : cty .NumberIntVal (int64 (rfc3339 .Hour ())),
297+ "minute" : cty .NumberIntVal (int64 (rfc3339 .Minute ())),
298+ "second" : cty .NumberIntVal (int64 (rfc3339 .Second ())),
299+ "unix" : cty .NumberIntVal (int64 (rfc3339 .Unix ())),
300+ "iso_year" : cty .NumberIntVal (int64 (isoYear )),
301+ "iso_week" : cty .NumberIntVal (int64 (isoWeek )),
302+ }), nil
303+ },
304+ })
305+ }
306+
251307func Stdlib () map [string ]function.Function {
252308 funcs := make (map [string ]function.Function , len (stdlibFunctions ))
253309 for _ , v := range stdlibFunctions {
0 commit comments