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, } }