diff --git a/lang/funcs/simplepoly/simplepoly.go b/lang/funcs/simplepoly/simplepoly.go index 8f4e4e82..30307d74 100644 --- a/lang/funcs/simplepoly/simplepoly.go +++ b/lang/funcs/simplepoly/simplepoly.go @@ -23,6 +23,7 @@ import ( "github.com/purpleidea/mgmt/lang/funcs" "github.com/purpleidea/mgmt/lang/interfaces" "github.com/purpleidea/mgmt/lang/types" + langutil "github.com/purpleidea/mgmt/lang/util" "github.com/purpleidea/mgmt/util/errwrap" ) @@ -55,7 +56,7 @@ func Register(name string, fns []*types.FuncValue) { typs = append(typs, f.T) } - if err := hasDuplicateTypes(typs); err != nil { + if err := langutil.HasDuplicateTypes(typs); err != nil { panic(fmt.Sprintf("polyfunc %s has a duplicate implementation: %+v", name, err)) } @@ -179,7 +180,7 @@ func (obj *simplePolyFunc) Validate() error { typs = append(typs, f.T) } - if err := hasDuplicateTypes(typs); err != nil { + if err := langutil.HasDuplicateTypes(typs); err != nil { return errwrap.Wrapf(err, "duplicate implementation found") } @@ -278,19 +279,3 @@ func (obj *simplePolyFunc) Close() error { close(obj.closeChan) return nil } - -// hasDuplicateTypes returns an error if the list of types is not unique. -func hasDuplicateTypes(typs []*types.Type) error { - // FIXME: do this comparison in < O(n^2) ? - for i, ti := range typs { - for j, tj := range typs { - if i == j { - continue // don't compare to self - } - if ti.Cmp(tj) == nil { - return fmt.Errorf("duplicate type of %+v found", ti) - } - } - } - return nil -} diff --git a/lang/util/util.go b/lang/util/util.go new file mode 100644 index 00000000..fbf45c98 --- /dev/null +++ b/lang/util/util.go @@ -0,0 +1,40 @@ +// 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 util + +import ( + "fmt" + + "github.com/purpleidea/mgmt/lang/types" +) + +// HasDuplicateTypes returns an error if the list of types is not unique. +func HasDuplicateTypes(typs []*types.Type) error { + // FIXME: do this comparison in < O(n^2) ? + for i, ti := range typs { + for j, tj := range typs { + if i == j { + continue // don't compare to self + } + if ti.Cmp(tj) == nil { + return fmt.Errorf("duplicate type of %+v found", ti) + } + } + } + return nil +} diff --git a/test/test-govet.sh b/test/test-govet.sh index 3f63ec6a..24af9b9b 100755 --- a/test/test-govet.sh +++ b/test/test-govet.sh @@ -62,6 +62,10 @@ function consistent-imports() { if grep $'\t"github.com/hashicorp/go-multierror"' "$1"; then return 1 fi + # import as langutil + if grep $'\t"github.com/purpleidea/mgmt/lang/util"' "$1"; then + return 1 + fi if grep $'\t"github.com/purpleidea/mgmt/engine/util"' "$1"; then # import as engineUtil return 1 fi