Share declaring import assembly
This commit is contained in:
@@ -285,3 +285,58 @@ func importedVersionClaim(documents []*document.Node, scope acquisitionScope, co
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// The declaring payload contributes once even when there are no admitted imports.
|
||||
func chargeDeclaringImport(parsed parsedSource, accounting *importAccounting, limits importLimits) *Diagnostic {
|
||||
accounting.sources++
|
||||
accounting.bytes += parsed.bytes
|
||||
accounting.nodes += countInputNodes(parsed.document)
|
||||
if accounting.sources > limits.sources {
|
||||
value := importDiagnostic(CodeImportLimitExceeded, "configuration exceeds the source-count limit", nil)
|
||||
return &value
|
||||
}
|
||||
if accounting.bytes > limits.bytes {
|
||||
value := importDiagnostic(CodeImportLimitExceeded, "configuration exceeds the aggregate byte limit", nil)
|
||||
return &value
|
||||
}
|
||||
if accounting.nodes > limits.nodes {
|
||||
value := importDiagnostic(CodeImportLimitExceeded, "configuration exceeds the aggregate node limit", nil)
|
||||
return &value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func prepareDeclaringImportScope(root acquiredContribution, accounting *importAccounting, limits importLimits) (acquisitionScope, *Diagnostic) {
|
||||
scope := acquisitionScope{owner: root.identity}
|
||||
if root.source.placementMode == PlacementModeSequenceItem {
|
||||
root.document = root.payload
|
||||
} else {
|
||||
destination := root.source.Destination
|
||||
_, placed, err := placeDocument(root.payload, destination, root.payload.Location, maxDocumentDepth, maxDocumentNodes)
|
||||
if err != nil {
|
||||
diagnostic := sourceDiagnostic(CodeSourceLimitExceeded, root.source.ID, "configuration exceeds the source depth or node limit after destination placement")
|
||||
return acquisitionScope{}, &diagnostic
|
||||
}
|
||||
placementNodes := destinationWrapperNodeCount(destination)
|
||||
if accounting.nodes+placementNodes > limits.nodes {
|
||||
diagnostic := importDiagnostic(CodeImportLimitExceeded, "configuration exceeds the aggregate node limit", nil)
|
||||
return acquisitionScope{}, &diagnostic
|
||||
}
|
||||
accounting.nodes += placementNodes
|
||||
root.document, root.destination = placed, destination.clone()
|
||||
scope.destination = destination.clone()
|
||||
}
|
||||
scope.contributions = []acquiredContribution{root}
|
||||
return scope, nil
|
||||
}
|
||||
|
||||
func finalizeDeclaringImportScope(scope acquisitionScope, root acquiredContribution, accounting *importAccounting, limits importLimits) (acquisitionScope, *Diagnostic) {
|
||||
if root.source.placementMode == PlacementModeSequenceItem {
|
||||
root.destination = root.source.Destination.clone()
|
||||
localScope := scope
|
||||
root.pendingItem = &localScope
|
||||
scope = acquisitionScope{owner: root.identity, destination: root.destination.clone(), contributions: []acquiredContribution{root}}
|
||||
}
|
||||
diagnostic := reservePendingItemPlacements(&scope, limits, accounting)
|
||||
return scope, diagnostic
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user