diff --git a/lang/funcs/core/corestrings/split_func.go b/lang/funcs/core/corestrings/split_func.go new file mode 100644 index 00000000..bb79da8d --- /dev/null +++ b/lang/funcs/core/corestrings/split_func.go @@ -0,0 +1,50 @@ +// Mgmt +// Copyright (C) 2013-2018+ 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 corestrings + +import ( + "strings" + + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(moduleName, "split", &types.FuncValue{ + T: types.NewType("func(a str, b str) []str"), + V: Split, + }) +} + +// Split splits the input string using the separator and returns the +// segments as a list. +func Split(input []types.Value) (types.Value, error) { + str, sep := input[0].Str(), input[1].Str() + + segments := strings.Split(str, sep) + + listVal := types.NewList(types.NewType("[]str")) + + for _, segment := range segments { + listVal.Add(&types.StrValue{ + V: segment, + }) + } + + return listVal, nil +} diff --git a/lang/funcs/core/corestrings/split_func_test.go b/lang/funcs/core/corestrings/split_func_test.go new file mode 100644 index 00000000..4724d990 --- /dev/null +++ b/lang/funcs/core/corestrings/split_func_test.go @@ -0,0 +1,64 @@ +// Mgmt +// Copyright (C) 2013-2018+ 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 corestrings + +import ( + "fmt" + "testing" + + "github.com/purpleidea/mgmt/lang/types" + "github.com/purpleidea/mgmt/util" +) + +func testSplit(input, sep string, output []string) error { + inputVal, sepVal := &types.StrValue{V: input}, &types.StrValue{V: sep} + + val, err := Split([]types.Value{inputVal, sepVal}) + if err != nil { + return err + } + listVal, ok := val.(*types.ListValue) + if !ok { + return fmt.Errorf("split did not return a list") + } + for _, segment := range output { + if _, ok := listVal.Contains(&types.StrValue{V: segment}); !ok { + return fmt.Errorf("output does not contained expected segment %s", segment) + } + } + for _, segment := range listVal.V { + if !util.StrInList(segment.Str(), output) { + return fmt.Errorf("output contains unexpected segment %s", segment.Str()) + } + } + return nil +} + +func TestSplit(t *testing.T) { + values := map[string][]string{ + "hello,world": {"hello", "world"}, + "hello world": {"hello world"}, + "hello;world": {"hello;world"}, + } + + for input, output := range values { + if err := testSplit(input, ",", output); err != nil { + t.Error(err) + } + } +}