From ae1860e859d5f550cc20a4205fb424d7223c607d Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Fri, 1 Nov 2019 11:12:32 +0100 Subject: [PATCH] lang: funcs: Add datetime.format function Signed-off-by: Julien Pivotto --- examples/lang/datetime4.mcl | 10 ++++ lang/funcs/core/datetime/format_func.go | 51 ++++++++++++++++++++ lang/funcs/core/datetime/format_func_test.go | 39 +++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 examples/lang/datetime4.mcl create mode 100644 lang/funcs/core/datetime/format_func.go create mode 100644 lang/funcs/core/datetime/format_func_test.go diff --git a/examples/lang/datetime4.mcl b/examples/lang/datetime4.mcl new file mode 100644 index 00000000..29a10de2 --- /dev/null +++ b/examples/lang/datetime4.mcl @@ -0,0 +1,10 @@ +import "datetime" +import "sys" +import "example" + +$now = datetime.now() + +file "/tmp/mgmt-datetime" { + state => "exists", + content => template("Il est l'or Monseignor: {{ . }}\n", datetime.format($now, "15:04:05")), +} diff --git a/lang/funcs/core/datetime/format_func.go b/lang/funcs/core/datetime/format_func.go new file mode 100644 index 00000000..11968f77 --- /dev/null +++ b/lang/funcs/core/datetime/format_func.go @@ -0,0 +1,51 @@ +// Mgmt +// Copyright (C) 2013-2019+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package coredatetime + +import ( + "fmt" + "time" + + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(ModuleName, "format", &types.FuncValue{ + T: types.NewType("func(a int, b str) str"), + V: Format, + }) +} + +// Format returns returns a textual representation of the input time. The format +// has to be defined like specified by the golang "time" package. The time is +// the number of seconds since the epoch, and matches what comes from our Now +// function. +// Golang documentation: https://golang.org/pkg/time/#Time.Format +func Format(input []types.Value) (types.Value, error) { + epochDelta := input[0].Int() + if epochDelta < 0 { + return nil, fmt.Errorf("epoch delta must be positive") + } + format := input[1].Str() + + v := time.Unix(epochDelta, 0).Format(format) + return &types.StrValue{ + V: v, + }, nil +} diff --git a/lang/funcs/core/datetime/format_func_test.go b/lang/funcs/core/datetime/format_func_test.go new file mode 100644 index 00000000..733af4a8 --- /dev/null +++ b/lang/funcs/core/datetime/format_func_test.go @@ -0,0 +1,39 @@ +// Mgmt +// Copyright (C) 2013-2019+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// +build !darwin + +package coredatetime + +import ( + "testing" + + "github.com/purpleidea/mgmt/lang/types" +) + +func TestFormat(t *testing.T) { + inputVal := &types.IntValue{V: 1443158163} + inputFormat := &types.StrValue{V: "2006"} + + val, err := Format([]types.Value{inputVal, inputFormat}) + if err != nil { + t.Error(err) + } + if val.String() != `"2015"` { + t.Errorf("invalid output, expected %s, got %s", `"2015"`, val.String()) + } +}