github.com/eliastor/durgaform@v0.0.0-20220816172711-d0ab2d17673e/internal/lang/funcs/datetime.go (about)

     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 Durgaform 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 Durgaform 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  }