Documentation ¶
Overview ¶
Package value defines types for an in-memory representation of yaml or json objects, organized for convenient comparison with a schema (as defined by the sibling schema package). Functions for reading and writing the objects are also provided.
Index ¶
- Constants
- Variables
- func BoolCompare(lhs, rhs bool) int
- func Compare(lhs, rhs Value) int
- func CompareUsing(a Allocator, lhs, rhs Value) int
- func Equals(lhs, rhs Value) bool
- func EqualsUsing(a Allocator, lhs, rhs Value) bool
- func FloatCompare(lhs, rhs float64) int
- func IntCompare(lhs, rhs int64) int
- func Less(lhs, rhs Value) bool
- func ListCompare(lhs, rhs List) int
- func ListCompareUsing(a Allocator, lhs, rhs List) int
- func ListEquals(lhs, rhs List) bool
- func ListEqualsUsing(a Allocator, lhs, rhs List) bool
- func ListLess(lhs, rhs List) bool
- func MapCompare(lhs, rhs Map) int
- func MapCompareUsing(a Allocator, lhs, rhs Map) int
- func MapEquals(lhs, rhs Map) bool
- func MapEqualsUsing(a Allocator, lhs, rhs Map) bool
- func MapLess(lhs, rhs Map) bool
- func MapZip(lhs, rhs Map, order MapTraverseOrder, fn func(key string, lhs, rhs Value) bool) bool
- func MapZipUsing(a Allocator, lhs, rhs Map, order MapTraverseOrder, ...) bool
- func ToJSON(v Value) ([]byte, error)
- func ToString(v Value) string
- func ToYAML(v Value) ([]byte, error)
- func WriteJSONStream(v Value, stream *jsoniter.Stream)
- type Allocator
- type Field
- type FieldCacheEntry
- type FieldList
- type List
- type ListRange
- type Map
- type MapTraverseOrder
- type TypeReflectCacheEntry
- func (e TypeReflectCacheEntry) CanConvertFromUnstructured() bool
- func (e TypeReflectCacheEntry) CanConvertToUnstructured() bool
- func (e TypeReflectCacheEntry) Fields() map[string]*FieldCacheEntry
- func (e TypeReflectCacheEntry) FromUnstructured(sv, dv reflect.Value) error
- func (e TypeReflectCacheEntry) OrderedFields() []*FieldCacheEntry
- func (e TypeReflectCacheEntry) ToUnstructured(sv reflect.Value) (interface{}, error)
- type UnstructuredConverter
- type Value
Constants ¶
const ( // Unordered indicates that the map traversal has no ordering requirement. Unordered = iota // LexicalKeyOrder indicates that the map traversal is ordered by key, lexically. LexicalKeyOrder )
Variables ¶
var EmptyRange = &emptyRange{}
var HeapAllocator = &heapAllocator{}
HeapAllocator simply allocates objects to the heap. It is the default allocator used receiver functions on the value interfaces that do not accept an allocator and should be used whenever allocating objects that will not be given back to an allocator by calling Allocator.Free(Value).
Functions ¶
func BoolCompare ¶
Compare compares booleans. The result will be 0 if b==rhs, -1 if b < rhs, and +1 if b > rhs.
func Compare ¶
Compare provides a total ordering for Value (so that they can be sorted, even if they are of different types). The result will be 0 if v==rhs, -1 if v < rhs, and +1 if v > rhs.
func CompareUsing ¶
CompareUsing uses the provided allocator and provides a total ordering for Value (so that they can be sorted, even if they are of different types). The result will be 0 if v==rhs, -1 if v < rhs, and +1 if v > rhs.
func EqualsUsing ¶
EqualsUsing uses the provided allocator and returns true iff the two values are equal.
func FloatCompare ¶
Compare compares floats. The result will be 0 if lhs==rhs, -1 if f < rhs, and +1 if f > rhs.
func IntCompare ¶
IntCompare compares integers. The result will be 0 if i==rhs, -1 if i < rhs, and +1 if i > rhs.
func Less ¶
Less provides a total ordering for Value (so that they can be sorted, even if they are of different types).
func ListCompare ¶
ListCompare compares two lists lexically. The result will be 0 if l==rhs, -1 if l < rhs, and +1 if l > rhs.
func ListCompareUsing ¶
ListCompareUsing uses the provided allocator and compares two lists lexically. The result will be 0 if l==rhs, -1 if l < rhs, and +1 if l > rhs.
func ListEquals ¶
ListEquals compares two lists lexically. WARN: This is a naive implementation, calling lhs.Equals(rhs) is typically the most efficient.
func ListEqualsUsing ¶
ListEqualsUsing uses the provided allocator and compares two lists lexically. WARN: This is a naive implementation, calling lhs.EqualsUsing(allocator, rhs) is typically the most efficient.
func MapCompareUsing ¶
MapCompareUsing uses the provided allocator and compares two maps lexically.
func MapEquals ¶
MapEquals returns true if lhs == rhs, false otherwise. This function acts on generic types and should not be used by callers, but can help implement Map.Equals. WARN: This is a naive implementation, calling lhs.Equals(rhs) is typically the most efficient.
func MapEqualsUsing ¶
MapEqualsUsing uses the provided allocator and returns true if lhs == rhs, false otherwise. This function acts on generic types and should not be used by callers, but can help implement Map.Equals. WARN: This is a naive implementation, calling lhs.EqualsUsing(allocator, rhs) is typically the most efficient.
func MapZip ¶
MapZip iterates over the entries of two maps together. If both maps contain a value for a given key, fn is called with the values from both maps, otherwise it is called with the value of the map that contains the key and nil for the other map. Returning false in the closure prematurely stops the iteration.
func MapZipUsing ¶
func MapZipUsing(a Allocator, lhs, rhs Map, order MapTraverseOrder, fn func(key string, lhs, rhs Value) bool) bool
MapZipUsing uses the provided allocator and iterates over the entries of two maps together. If both maps contain a value for a given key, fn is called with the values from both maps, otherwise it is called with the value of the map that contains the key and nil for the other map. Returning false in the closure prematurely stops the iteration.
func ToJSON ¶
ToJSON is a helper function for producing a JSon document.
func ToString ¶
ToString returns a human-readable representation of the value.
Types ¶
type Allocator ¶
type Allocator interface { // Free gives the allocator back any value objects returned by the "Using" // receiver functions on the value interfaces. // interface{} may be any of: Value, Map, List or Range. Free(interface{}) // contains filtered or unexported methods }
Allocator provides a value object allocation strategy. Value objects can be allocated by passing an allocator to the "Using" receiver functions on the value interfaces, e.g. Map.ZipUsing(allocator, ...). Value objects returned from "Using" functions should be given back to the allocator once longer needed by calling Allocator.Free(Value).
func NewFreelistAllocator ¶
func NewFreelistAllocator() Allocator
NewFreelistAllocator creates freelist based allocator. This allocator provides fast allocation and freeing of short lived value objects.
The freelists are bounded in size by freelistMaxSize. If more than this amount of value objects is allocated at once, the excess will be returned to the heap for garbage collection when freed.
This allocator is unsafe and must not be accessed concurrently by goroutines.
This allocator works well for traversal of value data trees. Typical usage is to acquire a freelist at the beginning of the traversal and use it through out for all temporary value access.
type FieldCacheEntry ¶
type FieldCacheEntry struct { // JsonName returns the name of the field according to the json tags on the struct field. JsonName string TypeEntry *TypeReflectCacheEntry // contains filtered or unexported fields }
FieldCacheEntry keeps data gathered using reflection about how the field of a struct is converted to/from unstructured.
func (*FieldCacheEntry) CanOmit ¶
func (f *FieldCacheEntry) CanOmit(fieldVal reflect.Value) bool
type FieldList ¶
type FieldList []Field
FieldList is a list of key-value pairs. Each field is expected to have a different name.
func (FieldList) Compare ¶
Compare compares two lists lexically. The result will be 0 if f==rhs, -1 if f < rhs, and +1 if f > rhs.
func (FieldList) Equals ¶
Equals returns true if the two fieldslist are equals, false otherwise.
func (FieldList) Less ¶
Less compares two lists lexically.
type List ¶
type List interface { // Length returns how many items can be found in the map. Length() int // At returns the item at the given position in the map. It will // panic if the index is out of range. At(int) Value // AtUsing uses the provided allocator and returns the item at the given // position in the map. It will panic if the index is out of range. // The returned Value should be given back to the Allocator when no longer needed // by calling Allocator.Free(Value). AtUsing(Allocator, int) Value // Range returns a ListRange for iterating over the items in the list. Range() ListRange // RangeUsing uses the provided allocator and returns a ListRange for // iterating over the items in the list. // The returned Range should be given back to the Allocator when no longer needed // by calling Allocator.Free(Value). RangeUsing(Allocator) ListRange // Equals compares the two lists, and return true if they are the same, false otherwise. // Implementations can use ListEquals as a general implementation for this methods. Equals(List) bool // EqualsUsing uses the provided allocator and compares the two lists, and return true if // they are the same, false otherwise. Implementations can use ListEqualsUsing as a general // implementation for this methods. EqualsUsing(Allocator, List) bool }
List represents a list object.
type ListRange ¶
type ListRange interface { // Next increments to the next item in the range, if there is one, and returns true, or returns false if there are no more items. Next() bool // Item returns the index and value of the current item in the range. or panics if there is no current item. // For efficiency, Item may reuse the values returned by previous Item calls. Callers should be careful avoid holding // pointers to the value returned by Item() that escape the iteration loop since they become invalid once either // Item() or Allocator.Free() is called. Item() (index int, value Value) }
ListRange represents a single iteration across the items of a list.
type Map ¶
type Map interface { // Set changes or set the value of the given key. Set(key string, val Value) // Get returns the value for the given key, if present, or (nil, false) otherwise. Get(key string) (Value, bool) // GetUsing uses the provided allocator and returns the value for the given key, // if present, or (nil, false) otherwise. // The returned Value should be given back to the Allocator when no longer needed // by calling Allocator.Free(Value). GetUsing(a Allocator, key string) (Value, bool) // Has returns true if the key is present, or false otherwise. Has(key string) bool // Delete removes the key from the map. Delete(key string) // Equals compares the two maps, and return true if they are the same, false otherwise. // Implementations can use MapEquals as a general implementation for this methods. Equals(other Map) bool // EqualsUsing uses the provided allocator and compares the two maps, and return true if // they are the same, false otherwise. Implementations can use MapEqualsUsing as a general // implementation for this methods. EqualsUsing(a Allocator, other Map) bool // Iterate runs the given function for each key/value in the // map. Returning false in the closure prematurely stops the // iteration. Iterate(func(key string, value Value) bool) bool // IterateUsing uses the provided allocator and runs the given function for each key/value // in the map. Returning false in the closure prematurely stops the iteration. IterateUsing(Allocator, func(key string, value Value) bool) bool // Length returns the number of items in the map. Length() int // Empty returns true if the map is empty. Empty() bool // Zip iterates over the entries of two maps together. If both maps contain a value for a given key, fn is called // with the values from both maps, otherwise it is called with the value of the map that contains the key and nil // for the map that does not contain the key. Returning false in the closure prematurely stops the iteration. Zip(other Map, order MapTraverseOrder, fn func(key string, lhs, rhs Value) bool) bool // ZipUsing uses the provided allocator and iterates over the entries of two maps together. If both maps // contain a value for a given key, fn is called with the values from both maps, otherwise it is called with // the value of the map that contains the key and nil for the map that does not contain the key. Returning // false in the closure prematurely stops the iteration. ZipUsing(a Allocator, other Map, order MapTraverseOrder, fn func(key string, lhs, rhs Value) bool) bool }
Map represents a Map or go structure.
type MapTraverseOrder ¶
type MapTraverseOrder int
MapTraverseOrder defines the map traversal ordering available.
type TypeReflectCacheEntry ¶
type TypeReflectCacheEntry struct {
// contains filtered or unexported fields
}
TypeReflectCacheEntry keeps data gathered using reflection about how a type is converted to/from unstructured.
func TypeReflectEntryOf ¶
func TypeReflectEntryOf(t reflect.Type) *TypeReflectCacheEntry
TypeReflectEntryOf returns the TypeReflectCacheEntry of the provided reflect.Type.
func (TypeReflectCacheEntry) CanConvertFromUnstructured ¶
func (e TypeReflectCacheEntry) CanConvertFromUnstructured() bool
CanConvertFromUnstructured returns true if this TypeReflectCacheEntry can convert objects of the type from unstructured.
func (TypeReflectCacheEntry) CanConvertToUnstructured ¶
func (e TypeReflectCacheEntry) CanConvertToUnstructured() bool
CanConvertToUnstructured returns true if this TypeReflectCacheEntry can convert values of its type to unstructured.
func (TypeReflectCacheEntry) Fields ¶
func (e TypeReflectCacheEntry) Fields() map[string]*FieldCacheEntry
Fields returns a map of JSON field name to FieldCacheEntry for structs, or nil for non-structs.
func (TypeReflectCacheEntry) FromUnstructured ¶
func (e TypeReflectCacheEntry) FromUnstructured(sv, dv reflect.Value) error
FromUnstructured converts the provided source value from unstructured into the provided destination value.
func (TypeReflectCacheEntry) OrderedFields ¶
func (e TypeReflectCacheEntry) OrderedFields() []*FieldCacheEntry
Fields returns a map of JSON field name to FieldCacheEntry for structs, or nil for non-structs.
func (TypeReflectCacheEntry) ToUnstructured ¶
func (e TypeReflectCacheEntry) ToUnstructured(sv reflect.Value) (interface{}, error)
ToUnstructured converts the provided value to unstructured and returns it.
type UnstructuredConverter ¶
type UnstructuredConverter interface { json.Marshaler // require that json.Marshaler is implemented // ToUnstructured returns the unstructured representation. ToUnstructured() interface{} }
UnstructuredConverter defines how a type can be converted directly to unstructured. Types that implement json.Marshaler may also optionally implement this interface to provide a more direct and more efficient conversion. All types that choose to implement this interface must still implement this same conversion via json.Marshaler.
type Value ¶
type Value interface { // IsMap returns true if the Value is a Map, false otherwise. IsMap() bool // IsList returns true if the Value is a List, false otherwise. IsList() bool // IsBool returns true if the Value is a bool, false otherwise. IsBool() bool // IsInt returns true if the Value is a int64, false otherwise. IsInt() bool // IsFloat returns true if the Value is a float64, false // otherwise. IsFloat() bool // IsString returns true if the Value is a string, false // otherwise. IsString() bool // IsMap returns true if the Value is null, false otherwise. IsNull() bool // AsMap converts the Value into a Map (or panic if the type // doesn't allow it). AsMap() Map // AsMapUsing uses the provided allocator and converts the Value // into a Map (or panic if the type doesn't allow it). AsMapUsing(Allocator) Map // AsList converts the Value into a List (or panic if the type // doesn't allow it). AsList() List // AsListUsing uses the provided allocator and converts the Value // into a List (or panic if the type doesn't allow it). AsListUsing(Allocator) List // AsBool converts the Value into a bool (or panic if the type // doesn't allow it). AsBool() bool // AsInt converts the Value into an int64 (or panic if the type // doesn't allow it). AsInt() int64 // AsFloat converts the Value into a float64 (or panic if the type // doesn't allow it). AsFloat() float64 // AsString converts the Value into a string (or panic if the type // doesn't allow it). AsString() string // Unstructured converts the Value into an Unstructured interface{}. Unstructured() interface{} }
A Value corresponds to an 'atom' in the schema. It should return true for at least one of the IsXXX methods below, or the value is considered "invalid"
func FromJSON ¶
FromJSON is a helper function for reading a JSON document.
func FromJSONFast ¶
FromJSONFast is a helper function for reading a JSON document.
func NewValueInterface ¶
func NewValueInterface(v interface{}) Value
NewValueInterface creates a Value backed by an "interface{}" type, typically an unstructured object in Kubernetes world. interface{} must be one of: map[string]interface{}, map[interface{}]interface{}, []interface{}, int types, float types, string or boolean. Nested interface{} must also be one of these types.
func NewValueReflect ¶
NewValueReflect creates a Value backed by an "interface{}" type, typically an structured object in Kubernetes world that is uses reflection to expose. The provided "interface{}" value must be a pointer so that the value can be modified via reflection. The provided "interface{}" may contain structs and types that are converted to Values by the jsonMarshaler interface.