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 }