github.com/beauknowssoftware/makehcl@v0.0.0-20200322000747-1b9bb1e1c008/internal/functions/glob.go (about)

     1  package functions
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  
     7  	"github.com/gobwas/glob"
     8  	"github.com/pkg/errors"
     9  	"github.com/zclconf/go-cty/cty"
    10  	"github.com/zclconf/go-cty/cty/function"
    11  )
    12  
    13  func Glob(args []cty.Value, _ cty.Type) (cty.Value, error) {
    14  	globString := args[0].AsString()
    15  	g, err := glob.Compile(globString, filepath.Separator)
    16  
    17  	if err != nil {
    18  		err = errors.Wrapf(err, "invalid glob %v", globString)
    19  		return cty.UnknownVal(cty.String), err
    20  	}
    21  
    22  	var vals []cty.Value
    23  
    24  	err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
    25  		if g.Match(path) {
    26  			vals = append(vals, cty.StringVal(path))
    27  		}
    28  		return nil
    29  	})
    30  
    31  	if err != nil {
    32  		return cty.UnknownVal(cty.String), err
    33  	}
    34  
    35  	if len(vals) == 0 {
    36  		return cty.ListValEmpty(cty.String), nil
    37  	}
    38  
    39  	return cty.ListVal(vals), nil
    40  }
    41  
    42  var GlobSpec = function.Spec{
    43  	Params: []function.Parameter{
    44  		{Type: cty.String},
    45  	},
    46  	Type: function.StaticReturnType(cty.List(cty.String)),
    47  	Impl: Glob,
    48  }