type AttributeFactory … type Qualifier … type ConstantQualifier … type Attribute … type NamespacedAttribute … type AttrFactoryOption … // EnableErrorOnBadPresenceTest error generation when a presence test or optional field selection // is performed on a primitive type. func EnableErrorOnBadPresenceTest(value bool) AttrFactoryOption { … } // NewAttributeFactory returns a default AttributeFactory which is produces Attribute values // capable of resolving types by simple names and qualify the values using the supported qualifier // types: bool, int, string, and uint. func NewAttributeFactory(cont *containers.Container, a types.Adapter, p types.Provider, opts ...AttrFactoryOption) AttributeFactory { … } type attrFactory … // AbsoluteAttribute refers to a variable value and an optional qualifier path. // // The namespaceNames represent the names the variable could have based on namespace // resolution rules. func (r *attrFactory) AbsoluteAttribute(id int64, names ...string) NamespacedAttribute { … } // ConditionalAttribute supports the case where an attribute selection may occur on a conditional // expression, e.g. (cond ? a : b).c func (r *attrFactory) ConditionalAttribute(id int64, expr Interpretable, t, f Attribute) Attribute { … } // MaybeAttribute collects variants of unchecked AbsoluteAttribute values which could either be // direct variable accesses or some combination of variable access with qualification. func (r *attrFactory) MaybeAttribute(id int64, name string) Attribute { … } // RelativeAttribute refers to an expression and an optional qualifier path. func (r *attrFactory) RelativeAttribute(id int64, operand Interpretable) Attribute { … } // NewQualifier is an implementation of the AttributeFactory interface. func (r *attrFactory) NewQualifier(objType *types.Type, qualID int64, val any, opt bool) (Qualifier, error) { … } type absoluteAttribute … // ID implements the Attribute interface method. func (a *absoluteAttribute) ID() int64 { … } // IsOptional returns trivially false for an attribute as the attribute represents a fully // qualified variable name. If the attribute is used in an optional manner, then an attrQualifier // is created and marks the attribute as optional. func (a *absoluteAttribute) IsOptional() bool { … } // AddQualifier implements the Attribute interface method. func (a *absoluteAttribute) AddQualifier(qual Qualifier) (Attribute, error) { … } // CandidateVariableNames implements the NamespaceAttribute interface method. func (a *absoluteAttribute) CandidateVariableNames() []string { … } // Qualifiers returns the list of Qualifier instances associated with the namespaced attribute. func (a *absoluteAttribute) Qualifiers() []Qualifier { … } // Qualify is an implementation of the Qualifier interface method. func (a *absoluteAttribute) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (a *absoluteAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } // String implements the Stringer interface method. func (a *absoluteAttribute) String() string { … } // Resolve returns the resolved Attribute value given the Activation, or error if the Attribute // variable is not found, or if its Qualifiers cannot be applied successfully. // // If the variable name cannot be found as an Activation variable or in the TypeProvider as // a type, then the result is `nil`, `error` with the error indicating the name of the first // variable searched as missing. func (a *absoluteAttribute) Resolve(vars Activation) (any, error) { … } type conditionalAttribute … // ID is an implementation of the Attribute interface method. func (a *conditionalAttribute) ID() int64 { … } // IsOptional returns trivially false for an attribute as the attribute represents a fully // qualified variable name. If the attribute is used in an optional manner, then an attrQualifier // is created and marks the attribute as optional. func (a *conditionalAttribute) IsOptional() bool { … } // AddQualifier appends the same qualifier to both sides of the conditional, in effect managing // the qualification of alternate attributes. func (a *conditionalAttribute) AddQualifier(qual Qualifier) (Attribute, error) { … } // Qualify is an implementation of the Qualifier interface method. func (a *conditionalAttribute) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (a *conditionalAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } // Resolve evaluates the condition, and then resolves the truthy or falsy branch accordingly. func (a *conditionalAttribute) Resolve(vars Activation) (any, error) { … } // String is an implementation of the Stringer interface method. func (a *conditionalAttribute) String() string { … } type maybeAttribute … // ID is an implementation of the Attribute interface method. func (a *maybeAttribute) ID() int64 { … } // IsOptional returns trivially false for an attribute as the attribute represents a fully // qualified variable name. If the attribute is used in an optional manner, then an attrQualifier // is created and marks the attribute as optional. func (a *maybeAttribute) IsOptional() bool { … } // AddQualifier adds a qualifier to each possible attribute variant, and also creates // a new namespaced variable from the qualified value. // // The algorithm for building the maybe attribute is as follows: // // 1. Create a maybe attribute from a simple identifier when it occurs in a parsed-only expression // // mb = MaybeAttribute(<id>, "a") // // Initializing the maybe attribute creates an absolute attribute internally which includes the // possible namespaced names of the attribute. In this example, let's assume we are in namespace // 'ns', then the maybe is either one of the following variable names: // // possible variables names -- ns.a, a // // 2. Adding a qualifier to the maybe means that the variable name could be a longer qualified // name, or a field selection on one of the possible variable names produced earlier: // // mb.AddQualifier("b") // // possible variables names -- ns.a.b, a.b // possible field selection -- ns.a['b'], a['b'] // // If none of the attributes within the maybe resolves a value, the result is an error. func (a *maybeAttribute) AddQualifier(qual Qualifier) (Attribute, error) { … } // Qualify is an implementation of the Qualifier interface method. func (a *maybeAttribute) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (a *maybeAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } // Resolve follows the variable resolution rules to determine whether the attribute is a variable // or a field selection. func (a *maybeAttribute) Resolve(vars Activation) (any, error) { … } // String is an implementation of the Stringer interface method. func (a *maybeAttribute) String() string { … } type relativeAttribute … // ID is an implementation of the Attribute interface method. func (a *relativeAttribute) ID() int64 { … } // IsOptional returns trivially false for an attribute as the attribute represents a fully // qualified variable name. If the attribute is used in an optional manner, then an attrQualifier // is created and marks the attribute as optional. func (a *relativeAttribute) IsOptional() bool { … } // AddQualifier implements the Attribute interface method. func (a *relativeAttribute) AddQualifier(qual Qualifier) (Attribute, error) { … } // Qualify is an implementation of the Qualifier interface method. func (a *relativeAttribute) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (a *relativeAttribute) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } // Resolve expression value and qualifier relative to the expression result. func (a *relativeAttribute) Resolve(vars Activation) (any, error) { … } // String is an implementation of the Stringer interface method. func (a *relativeAttribute) String() string { … } func newQualifier(adapter types.Adapter, id int64, v any, opt, errorOnBadPresenceTest bool) (Qualifier, error) { … } type attrQualifier … // ID implements the Qualifier interface method and returns the qualification instruction id // rather than the attribute id. func (q *attrQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *attrQualifier) IsOptional() bool { … } type stringQualifier … // ID is an implementation of the Qualifier interface method. func (q *stringQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *stringQualifier) IsOptional() bool { … } // Qualify implements the Qualifier interface method. func (q *stringQualifier) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (q *stringQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } func (q *stringQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *stringQualifier) Value() ref.Val { … } type intQualifier … // ID is an implementation of the Qualifier interface method. func (q *intQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *intQualifier) IsOptional() bool { … } // Qualify implements the Qualifier interface method. func (q *intQualifier) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (q *intQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } func (q *intQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *intQualifier) Value() ref.Val { … } type uintQualifier … // ID is an implementation of the Qualifier interface method. func (q *uintQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *uintQualifier) IsOptional() bool { … } // Qualify implements the Qualifier interface method. func (q *uintQualifier) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (q *uintQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } func (q *uintQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *uintQualifier) Value() ref.Val { … } type boolQualifier … // ID is an implementation of the Qualifier interface method. func (q *boolQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *boolQualifier) IsOptional() bool { … } // Qualify implements the Qualifier interface method. func (q *boolQualifier) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (q *boolQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } func (q *boolQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *boolQualifier) Value() ref.Val { … } type fieldQualifier … // ID is an implementation of the Qualifier interface method. func (q *fieldQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *fieldQualifier) IsOptional() bool { … } // Qualify implements the Qualifier interface method. func (q *fieldQualifier) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (q *fieldQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *fieldQualifier) Value() ref.Val { … } type doubleQualifier … // ID is an implementation of the Qualifier interface method. func (q *doubleQualifier) ID() int64 { … } // IsOptional implements the Qualifier interface method. func (q *doubleQualifier) IsOptional() bool { … } // Qualify implements the Qualifier interface method. func (q *doubleQualifier) Qualify(vars Activation, obj any) (any, error) { … } func (q *doubleQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } func (q *doubleQualifier) qualifyInternal(vars Activation, obj any, presenceTest, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *doubleQualifier) Value() ref.Val { … } type unknownQualifier … // ID is an implementation of the Qualifier interface method. func (q *unknownQualifier) ID() int64 { … } // IsOptional returns trivially false as an the unknown value is always returned. func (q *unknownQualifier) IsOptional() bool { … } // Qualify returns the unknown value associated with this qualifier. func (q *unknownQualifier) Qualify(vars Activation, obj any) (any, error) { … } // QualifyIfPresent is an implementation of the Qualifier interface method. func (q *unknownQualifier) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { … } // Value implements the ConstantQualifier interface func (q *unknownQualifier) Value() ref.Val { … } func applyQualifiers(vars Activation, obj any, qualifiers []Qualifier) (any, bool, error) { … } // attrQualify performs a qualification using the result of an attribute evaluation. func attrQualify(fac AttributeFactory, vars Activation, obj any, qualAttr Attribute) (any, error) { … } // attrQualifyIfPresent conditionally performs the qualification of the result of attribute is present // on the target object. func attrQualifyIfPresent(fac AttributeFactory, vars Activation, obj any, qualAttr Attribute, presenceOnly bool) (any, bool, error) { … } // refQualify attempts to convert the value to a CEL value and then uses reflection methods to try and // apply the qualifier with the option to presence test field accesses before retrieving field values. func refQualify(adapter types.Adapter, obj any, idx ref.Val, presenceTest, presenceOnly, errorOnBadPresenceTest bool) (ref.Val, bool, error) { … } type resolutionError … func (e *resolutionError) isMissingAttribute() bool { … } func missingIndex(missing ref.Val) *resolutionError { … } func missingKey(missing ref.Val) *resolutionError { … } func missingAttribute(attr string) *resolutionError { … } // Error implements the error interface method. func (e *resolutionError) Error() string { … } // Is implements the errors.Is() method used by more recent versions of Go. func (e *resolutionError) Is(err error) bool { … }