52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
|
// Copyright (c) 2018 Arista Networks, Inc.
|
||
|
// Use of this source code is governed by the Apache License 2.0
|
||
|
// that can be found in the COPYING file.
|
||
|
|
||
|
package key
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
// Path represents a path decomposed into elements where each
|
||
|
// element is a Key. A Path can be interpreted as either
|
||
|
// absolute or relative depending on how it is used.
|
||
|
type Path []Key
|
||
|
|
||
|
// String returns the Path as an absolute path string.
|
||
|
func (p Path) String() string {
|
||
|
if len(p) == 0 {
|
||
|
return "/"
|
||
|
}
|
||
|
var buf bytes.Buffer
|
||
|
for _, element := range p {
|
||
|
buf.WriteByte('/')
|
||
|
buf.WriteString(element.String())
|
||
|
}
|
||
|
return buf.String()
|
||
|
}
|
||
|
|
||
|
// MarshalJSON marshals a Path to JSON.
|
||
|
func (p Path) MarshalJSON() ([]byte, error) {
|
||
|
return []byte(fmt.Sprintf(`{"_path":%q}`, p)), nil
|
||
|
}
|
||
|
|
||
|
// Equal returns whether a Path is equal to @other.
|
||
|
func (p Path) Equal(other interface{}) bool {
|
||
|
o, ok := other.(Path)
|
||
|
return ok && pathEqual(p, o)
|
||
|
}
|
||
|
|
||
|
func pathEqual(a, b Path) bool {
|
||
|
if len(a) != len(b) {
|
||
|
return false
|
||
|
}
|
||
|
for i := range a {
|
||
|
if !a[i].Equal(b[i]) {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|