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 }