diff --git a/lang/funcs/convert/convert.go b/lang/funcs/convert/convert.go new file mode 100644 index 00000000..f1624a77 --- /dev/null +++ b/lang/funcs/convert/convert.go @@ -0,0 +1,23 @@ +// 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 convert + +const ( + // ModuleName is the prefix given to all the functions in this module. + ModuleName = "convert" +) diff --git a/lang/funcs/convert/to_float.go b/lang/funcs/convert/to_float.go new file mode 100644 index 00000000..2afd52b2 --- /dev/null +++ b/lang/funcs/convert/to_float.go @@ -0,0 +1,37 @@ +// 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 convert + +import ( + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(ModuleName, "to_float", &types.FuncValue{ + T: types.NewType("func(a int) float"), + V: ToFloat, + }) +} + +// ToFloat converts an integer to a float. +func ToFloat(input []types.Value) (types.Value, error) { + return &types.FloatValue{ + V: float64(input[0].Int()), + }, nil +} diff --git a/lang/funcs/convert/to_float_test.go b/lang/funcs/convert/to_float_test.go new file mode 100644 index 00000000..934b172f --- /dev/null +++ b/lang/funcs/convert/to_float_test.go @@ -0,0 +1,44 @@ +// 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 convert + +import ( + "testing" + + "github.com/purpleidea/mgmt/lang/types" +) + +func testToFloat(t *testing.T, input int64, expected float64) { + got, err := ToFloat([]types.Value{&types.IntValue{V: input}}) + if err != nil { + t.Error(err) + return + } + if got.Float() != expected { + t.Errorf("invalid output, expected %v, got %v", expected, got.Float()) + return + } +} + +func TestToFloat1(t *testing.T) { + testToFloat(t, 2, 2.0) +} + +func TestToFloat2(t *testing.T) { + testToFloat(t, 7, 7.0) +} diff --git a/lang/funcs/convert/to_int.go b/lang/funcs/convert/to_int.go new file mode 100644 index 00000000..b3c29389 --- /dev/null +++ b/lang/funcs/convert/to_int.go @@ -0,0 +1,37 @@ +// 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 convert + +import ( + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(ModuleName, "to_int", &types.FuncValue{ + T: types.NewType("func(a float) int"), + V: ToInt, + }) +} + +// ToInt converts a float to an integer. +func ToInt(input []types.Value) (types.Value, error) { + return &types.IntValue{ + V: int64(input[0].Float()), + }, nil +} diff --git a/lang/funcs/convert/to_int_test.go b/lang/funcs/convert/to_int_test.go new file mode 100644 index 00000000..37d39e04 --- /dev/null +++ b/lang/funcs/convert/to_int_test.go @@ -0,0 +1,46 @@ +// 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 convert + +import ( + "testing" + + "github.com/purpleidea/mgmt/lang/types" +) + +func testToInt(t *testing.T, input float64, expected int64) { + + got, err := ToInt([]types.Value{&types.FloatValue{V: input}}) + if err != nil { + t.Error(err) + return + } + if got.Int() != expected { + t.Errorf("invalid output, expected %v, got %v", expected, got) + return + } +} + +func TestToInt1(t *testing.T) { + testToInt(t, 2.09, 2) + +} + +func TestToInt2(t *testing.T) { + testToInt(t, 7.8, 7) +}