func findDashboardFilter()

in code/go/internal/validator/semantic/validate_kibana_filter_present.go [94:131]


func findDashboardFilter(file pkgpath.File) error {
	searchJSON, err := file.Values("$.attributes.kibanaSavedObjectMeta.searchSourceJSON")
	if err != nil {
		return fmt.Errorf("unable to find search definition: %w", err)
	}

	var search struct {
		Filter []any `mapstructure:"filter"`
		Query  struct {
			Query string `mapstructure:"query"`
		} `mapstructure:"query"`
	}
	switch searchJSON := searchJSON.(type) {
	case map[string]any:
		// Dashboard is decoded, as in source packages.
		err = mapstructure.Decode(searchJSON, &search)
		if err != nil {
			return fmt.Errorf("unable to decode search definition: %w", err)
		}
	case string:
		// Dashboard is encoded, as in built packages.
		err = json.Unmarshal([]byte(searchJSON), &search)
		if err != nil {
			return fmt.Errorf("unable to decode embedded search definition: %w", err)
		}
	default:
		return fmt.Errorf("unexpected type for search source JSON: %T", searchJSON)
	}

	if len(search.Filter) == 0 {
		if len(search.Query.Query) > 0 {
			return errDashboardWithQueryAndNoFilter
		}
		return errDashboardFilterNotFound
	}

	return nil
}