Files
ConfigKit/internal/engine/imports.go

104 lines
2.6 KiB
Go

package engine
import "strings"
const (
maxImportDepth = 64
maxImportSources = 1024
maxGlobEntries = 1_000_000
)
type importLimits struct {
depth int
sources int
bytes int64
nodes int
entries int
}
func defaultImportLimits() importLimits {
return importLimits{
depth: maxImportDepth, sources: maxImportSources,
bytes: maxTotalBytes, nodes: maxDocumentNodes, entries: maxGlobEntries,
}
}
type importRoute struct {
canonical string
locations []Location
key importNodeKey
}
type importAccounting struct {
sources int
bytes int64
nodes int
entries int
}
type importTraversal struct {
access *filesystemAccess
request importAcquisitionRequest
policy *acquisitionPolicy
state *acquisitionState
tier *tierAcquisitionState
scope acquisitionScope
itemScope bool
itemPrefix Path
itemFallback Path
sources []SourceInfo
active map[resourceIdentity]int
stack []importRoute
importGraph importInclusionGraph
}
func scheduleAcquisitionScopes(scope *acquisitionScope, dependencies importDependencyIndex) {
*scope = scheduleAcquisitionScope(*scope, dependencies)
for index := range scope.contributions {
if pending := scope.contributions[index].pendingItem; pending != nil {
scheduleAcquisitionScopes(pending, dependencies)
}
}
}
func sourceInfos(source *SourceInfo) []SourceInfo {
if source == nil {
return nil
}
return []SourceInfo{cloneSourceInfo(*source)}
}
func importDiagnostic(code Code, message string, location *Location) Diagnostic {
return Diagnostic{Code: code, Severity: SeverityError, Message: message, Primary: cloneLocation(location)}
}
func importCycleDiagnostic(target string, location Location, cycle []importRoute) Diagnostic {
paths := make([]string, 0, len(cycle)+1)
related := make([]Location, 0, len(cycle))
for _, route := range cycle {
paths = append(paths, route.canonical)
if len(route.locations) != 0 {
related = append(related, route.locations[len(route.locations)-1])
}
}
paths = append(paths, target)
return Diagnostic{
Code: CodeImportCycle, Severity: SeverityError,
Message: "import cycle detected: " + strings.Join(paths, " -> "),
Primary: &location, Related: related,
}
}
func importRepeatedDiagnostic(location Location, previous, current importRoute) Diagnostic {
related := append([]Location(nil), previous.locations...)
if len(current.locations) > 1 {
related = append(related, current.locations[:len(current.locations)-1]...)
}
return Diagnostic{
Code: CodeImportRepeated, Severity: SeverityError,
Message: "configuration source is included by more than one import route",
Primary: &location, Related: related,
}
}