in code/go/internal/validator/semantic/validate_kibana_no_dangling_object_ids.go [32:91]
func ValidateKibanaNoDanglingObjectIDs(fsys fspath.FS) specerrors.ValidationErrors {
var errs specerrors.ValidationErrors
installedIDs := []objectReference{}
referencedIDs := []objectReference{}
filePaths := path.Join("kibana", "*", "*.json")
objectFiles, err := pkgpath.Files(fsys, filePaths)
if err != nil {
errs = append(errs, specerrors.NewStructuredErrorf("error finding Kibana object files: %w", err))
return errs
}
for _, objectFile := range objectFiles {
filePath := objectFile.Path()
currentReference, err := getCurrentObjectReference(objectFile, fsys.Path(filePath))
if err != nil {
errs = append(errs,
specerrors.NewStructuredErrorf("unable to create reference from file [%s]: %w", fsys.Path(filePath), err),
)
}
installedIDs = append(installedIDs, currentReference)
referencedObjects, err := getReferencesListFromCurrentObject(objectFile, fsys.Path(filePath))
if err != nil {
errs = append(errs,
specerrors.NewStructuredErrorf("unable to create referenced objects from file [%s]: %w", fsys.Path(filePath), err),
)
continue
}
referencedIDs = append(referencedIDs, referencedObjects...)
}
if len(referencedIDs) == 0 {
return errs
}
for _, reference := range referencedIDs {
// look for installed IDs
found := slices.ContainsFunc(installedIDs, func(elem objectReference) bool {
if reference.objectID != elem.objectID {
return false
}
if reference.objectType != elem.objectType {
return false
}
return true
})
if !found {
errs = append(errs,
specerrors.NewStructuredError(
fmt.Errorf("file \"%s\" is invalid: dangling reference found: %s (%s)", reference.filePath, reference.objectID, reference.objectType),
specerrors.CodeKibanaDanglingObjectsIDs))
}
}
return errs
}