func ValidateKibanaNoDanglingObjectIDs()

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
}