Documentation ¶
Index ¶
- Constants
- func IsAdd(e Element) bool
- func IsDrop(e Element) bool
- type CombinedMapSlice
- type CombinedPrimitiveSlice
- type ConflictDetector
- type ConflictError
- type Element
- type EmptyElement
- func (e EmptyElement) GetLocal() interface{}
- func (e EmptyElement) GetRecorded() interface{}
- func (e EmptyElement) GetRemote() interface{}
- func (e EmptyElement) HasLocal() bool
- func (e EmptyElement) HasRecorded() bool
- func (e EmptyElement) HasRemote() bool
- func (e EmptyElement) IsAdd() bool
- func (e EmptyElement) IsDelete() bool
- func (e EmptyElement) Merge(v Strategy) (Result, error)
- type FieldMeta
- type FieldMetaImpl
- type HasElementData
- type ListElement
- type ListElementData
- type ListItem
- type MapElement
- type MapElementData
- type MergeKeyValue
- type MergeKeys
- type Operation
- type PrimitiveElement
- type PrimitiveListItem
- type RawElementData
- func (b RawElementData) GetLocal() interface{}
- func (b RawElementData) GetRecorded() interface{}
- func (b RawElementData) GetRemote() interface{}
- func (b *RawElementData) SetLocal(value interface{})
- func (b *RawElementData) SetRecorded(value interface{})
- func (b *RawElementData) SetRemote(value interface{})
- type Result
- type Strategy
- type TypeElement
Constants ¶
const ( // MergeStrategy is the strategy to merge the local and remote values MergeStrategy = "merge" // RetainKeysStrategy is the strategy to merge the local and remote values, but drop any fields not defined locally RetainKeysStrategy = "retainKeys" // ReplaceStrategy is the strategy to replace the remote value with the local value ReplaceStrategy = "replace" )
Variables ¶
This section is empty.
Functions ¶
Types ¶
type CombinedMapSlice ¶
type CombinedMapSlice struct {
Items []*ListItem
}
CombinedMapSlice is a slice of maps or types with merge keys
func (*CombinedMapSlice) UpsertLocal ¶
func (s *CombinedMapSlice) UpsertLocal(key MergeKeys, l interface{}) error
UpsertLocal adds l to the slice. If there is already a value of l sharing l's merge key in the slice for either the recorded or remote, set l the local value Otherwise append a new item to the list with the local value.
func (*CombinedMapSlice) UpsertRecorded ¶
func (s *CombinedMapSlice) UpsertRecorded(key MergeKeys, l interface{}) error
UpsertRecorded adds l to the slice. If there is already a value of l sharing l's merge key in the slice for either the local or remote, set l the recorded value Otherwise append a new item to the list with the recorded value.
func (*CombinedMapSlice) UpsertRemote ¶
func (s *CombinedMapSlice) UpsertRemote(key MergeKeys, l interface{}) error
UpsertRemote adds l to the slice. If there is already a value of l sharing l's merge key in the slice for either the recorded or local, set l the remote value Otherwise append a new item to the list with the remote value.
type CombinedPrimitiveSlice ¶
type CombinedPrimitiveSlice struct {
Items []*PrimitiveListItem
}
CombinedPrimitiveSlice implements a slice of primitives
func (*CombinedPrimitiveSlice) UpsertLocal ¶
func (s *CombinedPrimitiveSlice) UpsertLocal(l interface{})
UpsertLocal adds l to the slice. If there is already a value of l in the slice for either the recorded or remote, set on that value as the local value Otherwise append a new item to the list with the local value.
func (*CombinedPrimitiveSlice) UpsertRecorded ¶
func (s *CombinedPrimitiveSlice) UpsertRecorded(l interface{})
UpsertRecorded adds l to the slice. If there is already a value of l in the slice for either the local or remote, set on that value as the recorded value Otherwise append a new item to the list with the recorded value.
func (*CombinedPrimitiveSlice) UpsertRemote ¶
func (s *CombinedPrimitiveSlice) UpsertRemote(l interface{})
UpsertRemote adds l to the slice. If there is already a value of l in the slice for either the local or recorded, set on that value as the remote value Otherwise append a new item to the list with the remote value.
type ConflictDetector ¶ added in v1.11.0
type ConflictDetector interface {
HasConflict() error
}
ConflictDetector defines the capability to detect conflict. An element can examine remote/recorded value to detect conflict.
type ConflictError ¶ added in v1.11.0
type ConflictError struct {
// contains filtered or unexported fields
}
ConflictError represents a conflict error occurred during the merge operation.
func NewConflictError ¶ added in v1.11.0
func NewConflictError(e PrimitiveElement) *ConflictError
NewConflictError returns a ConflictError with detailed conflict information in element
func (*ConflictError) Error ¶ added in v1.11.0
func (c *ConflictError) Error() string
Error implements error
type Element ¶
type Element interface { // FieldMeta specifies which merge strategy to use for this element FieldMeta // Merge merges the recorded, local and remote values in the element using the Strategy // provided as an argument. Calls the type specific method on the Strategy - following the // "Accept" method from the "Visitor" pattern. // e.g. Merge on a ListElement will call Strategy.MergeList(self) // Returns the Result of the merged elements Merge(Strategy) (Result, error) // HasRecorded returns true if the field was explicitly // present in the recorded source. This is to differentiate between // undefined and set to null HasRecorded() bool // GetRecorded returns the field value from the recorded source of the object GetRecorded() interface{} // HasLocal returns true if the field was explicitly // present in the local source. This is to differentiate between // undefined and set to null HasLocal() bool // GetLocal returns the field value from the local source of the object GetLocal() interface{} // HasRemote returns true if the field was explicitly // present in the remote source. This is to differentiate between // undefined and set to null HasRemote() bool // GetRemote returns the field value from the remote source of the object GetRemote() interface{} }
Element contains the record, local, and remote value for a field in an object and metadata about the field read from openapi. Calling Merge on an element will apply the passed in strategy to Element - e.g. either replacing the whole element with the local copy or merging each of the recorded, local and remote fields of the element.
type EmptyElement ¶
type EmptyElement struct { // FieldMetaImpl contains metadata about the field from openapi FieldMetaImpl }
EmptyElement is a placeholder for when no value is set for a field so its type is unknown
func (EmptyElement) GetLocal ¶
func (e EmptyElement) GetLocal() interface{}
GetLocal implements Element.GetLocal
func (EmptyElement) GetRecorded ¶
func (e EmptyElement) GetRecorded() interface{}
GetRecorded implements Element.GetRecorded
func (EmptyElement) GetRemote ¶
func (e EmptyElement) GetRemote() interface{}
GetRemote implements Element.GetRemote
func (EmptyElement) HasLocal ¶
func (e EmptyElement) HasLocal() bool
HasLocal implements Element.HasLocal
func (EmptyElement) HasRecorded ¶
func (e EmptyElement) HasRecorded() bool
HasRecorded implements Element.HasRecorded
func (EmptyElement) HasRemote ¶
func (e EmptyElement) HasRemote() bool
HasRemote implements Element.IsAdd
func (EmptyElement) IsDelete ¶
func (e EmptyElement) IsDelete() bool
IsDelete implements Element.IsDelete
type FieldMeta ¶
type FieldMeta interface { // GetFieldMergeType returns the type of merge strategy to use for this field // maybe "merge", "replace" or "retainkeys" // TODO: There maybe multiple strategies, so this may need to be a slice, map, or struct // Address this in a follow up in the PR to introduce retainkeys strategy GetFieldMergeType() string // GetFieldMergeKeys returns the merge key to use when the MergeType is "merge" and underlying type is a list GetFieldMergeKeys() MergeKeys // GetFieldType returns the openapi field type - e.g. primitive, array, map, type, reference GetFieldType() string }
FieldMeta defines the strategy used to apply a Patch for an element
type FieldMetaImpl ¶
type FieldMetaImpl struct { // MergeType is the type of merge strategy to use for this field // maybe "merge", "replace" or "retainkeys" MergeType string // MergeKeys are the merge keys to use when the MergeType is "merge" and underlying type is a list MergeKeys MergeKeys // Type is the openapi type of the field - "list", "primitive", "map" Type string // Name contains name of the field Name string }
FieldMetaImpl implements FieldMeta
func (FieldMetaImpl) GetFieldMergeKeys ¶
func (s FieldMetaImpl) GetFieldMergeKeys() MergeKeys
GetFieldMergeKeys implements FieldMeta.GetFieldMergeKeys
func (FieldMetaImpl) GetFieldMergeType ¶
func (s FieldMetaImpl) GetFieldMergeType() string
GetFieldMergeType implements FieldMeta.GetFieldMergeType
func (FieldMetaImpl) GetFieldType ¶
func (s FieldMetaImpl) GetFieldType() string
GetFieldType implements FieldMeta.GetFieldType
type HasElementData ¶
type HasElementData struct {
// contains filtered or unexported fields
}
HasElementData contains whether a field was set in the recorded, local and remote sources
func (HasElementData) HasLocal ¶
func (e HasElementData) HasLocal() bool
HasLocal implements Element.HasLocal
func (HasElementData) HasRecorded ¶
func (e HasElementData) HasRecorded() bool
HasRecorded implements Element.HasRecorded
func (HasElementData) HasRemote ¶
func (e HasElementData) HasRemote() bool
HasRemote implements Element.HasRemote
type ListElement ¶
type ListElement struct { // FieldMetaImpl contains metadata about the field from openapi FieldMetaImpl ListElementData // Values contains the combined recorded-local-remote value of each item in the list // Present for lists that can be merged only. Contains the items // from each of the 3 lists merged into single Elements using // the merge-key. Values []Element }
ListElement contains the recorded, local and remote values for a field of type list
func (ListElement) HasConflict ¶ added in v1.11.0
func (e ListElement) HasConflict() error
HasConflict returns ConflictError if fields in recorded and remote of ListElement conflict
type ListElementData ¶
type ListElementData struct {
RawElementData
}
ListElementData contains the recorded, local and remote data for a list
func (ListElementData) GetLocalList ¶
func (e ListElementData) GetLocalList() []interface{}
GetLocalList returns the Local value as a list
func (ListElementData) GetRecordedList ¶
func (e ListElementData) GetRecordedList() []interface{}
GetRecordedList returns the Recorded value as a list
func (ListElementData) GetRemoteList ¶
func (e ListElementData) GetRemoteList() []interface{}
GetRemoteList returns the Remote value as a list
type ListItem ¶
type ListItem struct { // KeyValue is the merge key value of the item KeyValue MergeKeyValue // RawElementData contains the field values RawElementData }
ListItem represents a single value in a slice of maps or types
type MapElement ¶
type MapElement struct { // FieldMetaImpl contains metadata about the field from openapi FieldMetaImpl // MapElementData contains the value a field was set to MapElementData // Values contains the combined recorded-local-remote value of each item in the map // Values contains the values in mapElement. Element must contain // a Name matching its key in Values Values map[string]Element }
MapElement contains the recorded, local and remote values for a field of type map
func (MapElement) GetValues ¶
func (e MapElement) GetValues() map[string]Element
GetValues implements Element.GetValues
func (MapElement) HasConflict ¶ added in v1.11.0
func (e MapElement) HasConflict() error
HasConflict returns ConflictError if some elements in map conflict.
type MapElementData ¶
type MapElementData struct {
RawElementData
}
MapElementData contains the recorded, local and remote data for a map or type
func (MapElementData) GetLocalMap ¶
func (e MapElementData) GetLocalMap() map[string]interface{}
GetLocalMap returns the Local value as a map
func (MapElementData) GetRecordedMap ¶
func (e MapElementData) GetRecordedMap() map[string]interface{}
GetRecordedMap returns the Recorded value as a map
func (MapElementData) GetRemoteMap ¶
func (e MapElementData) GetRemoteMap() map[string]interface{}
GetRemoteMap returns the Remote value as a map
type MergeKeyValue ¶
MergeKeyValue records the value of the mergekey for an item in a list
func (MergeKeyValue) Equal ¶
func (v MergeKeyValue) Equal(o MergeKeyValue) bool
Equal returns true if the MergeKeyValues share the same value, representing the same item in a list
type MergeKeys ¶
type MergeKeys []string
MergeKeys is the set of fields on an object that uniquely identify and is used when merging lists to identify the "same" object independent of the ordering of the objects
func (MergeKeys) GetMergeKeyValue ¶
func (mk MergeKeys) GetMergeKeyValue(i interface{}) (MergeKeyValue, error)
GetMergeKeyValue parses the MergeKeyValue from an item in a list
type PrimitiveElement ¶
type PrimitiveElement struct { // FieldMetaImpl contains metadata about the field from openapi FieldMetaImpl // RawElementData contains the values the field was set to RawElementData }
PrimitiveElement contains the recorded, local and remote values for a field of type primitive
func (PrimitiveElement) HasConflict ¶ added in v1.11.0
func (e PrimitiveElement) HasConflict() error
HasConflict returns ConflictError if primitive element has conflict field. Conflicts happen when either of the following conditions: 1. A field is specified in both recorded and remote values, but does not match. 2. A field is specified in recorded values, but missing in remote values.
type PrimitiveListItem ¶
type PrimitiveListItem struct { // Value is the value of the primitive, should match recorded, local and remote Value interface{} RawElementData }
PrimitiveListItem represents a single value in a slice of primitives
type RawElementData ¶
type RawElementData struct { HasElementData // contains filtered or unexported fields }
RawElementData contains the raw recorded, local and remote data and metadata about whethere or not each was set
func NewRawElementData ¶
func NewRawElementData(recorded, local, remote interface{}) RawElementData
NewRawElementData returns a new RawElementData, setting IsSet to true for non-nil values, and leaving IsSet false for nil values. Note: use this only when you want a nil-value to be considered "unspecified" (ignore) and not "unset" (deleted).
func (RawElementData) GetLocal ¶
func (b RawElementData) GetLocal() interface{}
GetLocal implements Element.GetLocal
func (RawElementData) GetRecorded ¶
func (b RawElementData) GetRecorded() interface{}
GetRecorded implements Element.GetRecorded
func (RawElementData) GetRemote ¶
func (b RawElementData) GetRemote() interface{}
GetRemote implements Element.GetRemote
func (*RawElementData) SetLocal ¶
func (b *RawElementData) SetLocal(value interface{})
SetLocal sets the local value
func (*RawElementData) SetRecorded ¶
func (b *RawElementData) SetRecorded(value interface{})
SetRecorded sets the recorded value
func (*RawElementData) SetRemote ¶
func (b *RawElementData) SetRemote(value interface{})
SetRemote sets the remote value
type Result ¶
type Result struct { // Operation is the operation that should be performed for the merged field Operation Operation // MergedResult is the new merged value MergedResult interface{} }
Result is the result of merging fields
type Strategy ¶
type Strategy interface { // MergeList is invoked by ListElements when Merge is called MergeList(ListElement) (Result, error) // MergeMap is invoked by MapElements when Merge is called MergeMap(MapElement) (Result, error) // MergeType is invoked by TypeElements when Merge is called MergeType(TypeElement) (Result, error) // MergePrimitive is invoked by PrimitiveElements when Merge is called MergePrimitive(PrimitiveElement) (Result, error) // MergeEmpty is invoked by EmptyElements when Merge is called MergeEmpty(EmptyElement) (Result, error) }
Strategy implements a strategy for merging recorded, local and remote values contained in an element and returns the merged result. Follows the visitor pattern
type TypeElement ¶
type TypeElement struct { // FieldMetaImpl contains metadata about the field from openapi FieldMetaImpl MapElementData // Values contains the combined recorded-local-remote value of each field in the type // Values contains the values in mapElement. Element must contain // a Name matching its key in Values Values map[string]Element }
TypeElement contains the recorded, local and remote values for a field that is a complex type
func (TypeElement) GetValues ¶
func (e TypeElement) GetValues() map[string]Element
GetValues implements Element.GetValues
func (TypeElement) HasConflict ¶ added in v1.11.0
func (e TypeElement) HasConflict() error
HasConflict returns ConflictError if some elements in type conflict.