github.com/lyraproj/hiera@v1.0.0-rc4/config/path.go (about)

     1  package config
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"reflect"
     8  
     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/lyraproj/hiera/api"
    14  )
    15  
    16  type path struct {
    17  	original string
    18  	resolved string
    19  	exists   bool
    20  }
    21  
    22  var pathType = tf.NewNamed(
    23  	`hiera.path`,
    24  	func(v dgo.Value) dgo.Value {
    25  		m := v.(dgo.Map)
    26  		return &path{
    27  			original: m.Get(`original`).(dgo.String).GoString(),
    28  			resolved: m.Get(`resolved`).(dgo.String).GoString(),
    29  			exists:   m.Get(`exists`).(dgo.Boolean).GoBool()}
    30  	},
    31  	func(v dgo.Value) dgo.Value {
    32  		p := v.(*path)
    33  		return vf.Map(
    34  			`original`, p.original,
    35  			`resolved`, p.resolved,
    36  			`exists`, p.exists)
    37  	},
    38  	reflect.TypeOf(&path{}),
    39  	reflect.TypeOf((*api.Location)(nil)).Elem(),
    40  	nil)
    41  
    42  // NewPath returns a path Location
    43  func NewPath(original string) api.Location {
    44  	return &path{original: original}
    45  }
    46  
    47  func (p *path) Type() dgo.Type {
    48  	return pathType
    49  }
    50  
    51  func (p *path) HashCode() int32 {
    52  	return util.StringHash(p.original)
    53  }
    54  
    55  func (p *path) Equals(value interface{}) bool {
    56  	op, ok := value.(*path)
    57  	if ok {
    58  		ok = *p == *op
    59  	}
    60  	return ok
    61  }
    62  
    63  func (p *path) Exists() bool {
    64  	return p.exists
    65  }
    66  
    67  func (p *path) Kind() api.LocationKind {
    68  	return api.LcPath
    69  }
    70  
    71  func (p *path) String() string {
    72  	return fmt.Sprintf("path{ original:%s, resolved:%s, exist:%v}", p.original, p.resolved, p.exists)
    73  }
    74  
    75  func (p *path) Resolve(ic api.Invocation, dataDir string) []api.Location {
    76  	r, _ := ic.InterpolateString(p.original, false)
    77  	rp := filepath.Join(dataDir, r.String())
    78  	_, err := os.Stat(rp)
    79  	return []api.Location{&path{p.original, rp, err == nil}}
    80  }
    81  
    82  func (p *path) Original() string {
    83  	return p.original
    84  }
    85  
    86  func (p *path) Resolved() string {
    87  	return p.resolved
    88  }