github.com/yanndegat/hiera@v0.6.8/config/glob.go (about) 1 package config 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "reflect" 7 8 "github.com/bmatcuk/doublestar" 9 "github.com/lyraproj/dgo/dgo" 10 "github.com/lyraproj/dgo/tf" 11 "github.com/lyraproj/dgo/util" 12 "github.com/lyraproj/dgo/vf" 13 "github.com/yanndegat/hiera/api" 14 ) 15 16 type glob string 17 18 var globType = tf.NewNamed( 19 `hiera.glob`, 20 func(v dgo.Value) dgo.Value { 21 return glob(v.(dgo.String).GoString()) 22 }, 23 func(v dgo.Value) dgo.Value { 24 return vf.String(string(v.(glob))) 25 }, 26 reflect.TypeOf(glob(``)), 27 reflect.TypeOf((*api.Location)(nil)).Elem(), 28 nil) 29 30 // NewGlob returns a glob Location 31 func NewGlob(pattern string) api.Location { 32 return glob(pattern) 33 } 34 35 func (g glob) Type() dgo.Type { 36 return globType 37 } 38 39 func (g glob) Equals(other interface{}) bool { 40 return g == other 41 } 42 43 func (g glob) HashCode() int { 44 return util.StringHash(string(g)) 45 } 46 47 func (g glob) Exists() bool { 48 return false 49 } 50 51 func (g glob) Kind() api.LocationKind { 52 return api.LcGlob 53 } 54 55 func (g glob) String() string { 56 return fmt.Sprintf("glob{pattern:%s}", g.Original()) 57 } 58 59 func (g glob) Original() string { 60 return string(g) 61 } 62 63 func (g glob) Resolve(ic api.Invocation, dataDir string) []api.Location { 64 r, _ := ic.InterpolateString(g.Original(), false) 65 rp := filepath.Join(dataDir, r.String()) 66 matches, _ := doublestar.Glob(rp) 67 ls := make([]api.Location, len(matches)) 68 for i, m := range matches { 69 ls[i] = &path{g.Original(), m, true} 70 } 71 return ls 72 } 73 74 func (g glob) Resolved() string { 75 // This should never happen. 76 panic(fmt.Errorf(`resolved requested on a glob`)) 77 }