Extract inheritance input preparation
This commit is contained in:
88
internal/engine/inheritance_prepare.go
Normal file
88
internal/engine/inheritance_prepare.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package engine
|
||||
|
||||
import "gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
|
||||
type preparedInheritanceChild struct {
|
||||
payload *document.Node
|
||||
origins map[string]Origin
|
||||
policyTemplates collectionPolicyScope
|
||||
control *inheritanceControl
|
||||
controlOrigin Origin
|
||||
}
|
||||
|
||||
type preparedInheritanceParent struct {
|
||||
payload *document.Node
|
||||
historyParent *document.Node
|
||||
policyTemplates []collectionPolicyScope
|
||||
effectivePolicyTemplates []collectionPolicyScope
|
||||
parentPolicyScope collectionPolicyScope
|
||||
childPolicyScope collectionPolicyScope
|
||||
replaced collectionReplacementPaths
|
||||
transfer inheritanceTransfer
|
||||
}
|
||||
|
||||
func prepareInheritanceChild(template inheritanceExecutionTemplate, inputOrigins map[string]Origin) preparedInheritanceChild {
|
||||
policyTemplates := cloneCollectionPolicyScopeForInheritance(template.collectionPolicies)
|
||||
payload := withoutInheritanceDirective(template.entry.Value)
|
||||
prepared := preparedInheritanceChild{
|
||||
payload: payload, origins: directInheritanceOrigins(payload, template.path, inputOrigins),
|
||||
policyTemplates: policyTemplates,
|
||||
}
|
||||
if template.hasDirective {
|
||||
control := inheritanceControl{
|
||||
path: template.directivePath, locations: []Location{publicLocation(template.directive.Value.Location)},
|
||||
cancelled: template.cancelled,
|
||||
}
|
||||
controlOrigins := directInheritanceOrigins(template.directive.Value, control.path, inputOrigins)
|
||||
prepared.control = &control
|
||||
prepared.controlOrigin = controlOrigins[control.path.String()]
|
||||
}
|
||||
return prepared
|
||||
}
|
||||
|
||||
func prepareInheritanceParent(
|
||||
template inheritanceExecutionTemplate,
|
||||
parentPath Path,
|
||||
parent *document.Node,
|
||||
resolvedParentPolicyTemplates []collectionPolicyScope,
|
||||
resolvedParentPolicies collectionPolicyScope,
|
||||
child preparedInheritanceChild,
|
||||
applicationPolicy sequencePolicy,
|
||||
) preparedInheritanceParent {
|
||||
parentPolicies := cloneInheritancePolicyTemplates(resolvedParentPolicyTemplates)
|
||||
effectivePolicies := append(
|
||||
cloneInheritancePolicyTemplates(parentPolicies),
|
||||
cloneCollectionPolicyScopeForInheritance(child.policyTemplates),
|
||||
)
|
||||
parentPolicyScope := projectInheritanceCollectionPolicies(resolvedParentPolicies, template.path)
|
||||
childPolicyScope := projectCurrentInheritanceCollectionPolicies(child.policyTemplates, template.path)
|
||||
var replaced collectionReplacementPaths
|
||||
if len(parentPolicyScope.collections) != 0 || len(childPolicyScope.collections) != 0 {
|
||||
claims := compositionClaims{byPath: make(map[string][]compositionClaim)}
|
||||
claims.append(child.payload, template.path, 0)
|
||||
declarations := make(map[string][]sequenceDeclarationSpec, len(childPolicyScope.collections))
|
||||
for key, entry := range childPolicyScope.collections {
|
||||
declarations[key] = inheritanceDeclarationsAt(entry.destination, entry.policy)
|
||||
}
|
||||
parentPolicyScope, replaced = lowerCollectionPoliciesForClaims(parentPolicyScope, claims.ordered, declarations, applicationPolicy)
|
||||
}
|
||||
parentPayload := inheritanceParentPayload(parent, template.identityFields)
|
||||
historyParent := parent
|
||||
if len(template.identityFields) != 0 {
|
||||
// The retained parent snapshot is the inherited payload, before child
|
||||
// fields are applied, with parent identity excluded.
|
||||
historyParent = document.Clone(parentPayload)
|
||||
}
|
||||
transfer := inheritanceTransfer{
|
||||
from: parentPath, to: template.path, reference: template.directivePath,
|
||||
locations: []Location{publicLocation(template.directive.Value.Location)},
|
||||
policyTemplates: parentPolicies, templatePolicies: cloneCollectionPolicyScopeForInheritance(child.policyTemplates),
|
||||
projectedPolicies: projectInheritancePolicyTemplates([]collectionPolicyScope{resolvedParentPolicies}, template.path),
|
||||
}
|
||||
return preparedInheritanceParent{
|
||||
payload: parentPayload, historyParent: historyParent,
|
||||
policyTemplates: parentPolicies, effectivePolicyTemplates: effectivePolicies,
|
||||
parentPolicyScope: parentPolicyScope, childPolicyScope: childPolicyScope,
|
||||
replaced: replaced, transfer: transfer,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user