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  }