func parseDynamicTemplates()

in internal/fields/dynamictemplate.go [121:204]


func parseDynamicTemplates(rawDynamicTemplates []map[string]any) ([]dynamicTemplate, error) {
	dynamicTemplates := []dynamicTemplate{}

	for _, template := range rawDynamicTemplates {
		if len(template) != 1 {
			return nil, fmt.Errorf("unexpected number of dynamic template definitions found")
		}

		// there is just one dynamic template per object
		templateName := ""
		var rawContents any
		for key, value := range template {
			templateName = key
			rawContents = value
		}

		if shouldSkipDynamicTemplate(templateName) {
			continue
		}

		aDynamicTemplate := dynamicTemplate{
			name: templateName,
		}

		contents, ok := rawContents.(map[string]any)
		if !ok {
			return nil, fmt.Errorf("unexpected dynamic template format found for %q", templateName)
		}

		isRuntime := false
		for setting, value := range contents {
			switch setting {
			case "mapping":
				aDynamicTemplate.mapping = value
			case "runtime":
				isRuntime = true
			case "match_pattern":
				s, ok := value.(string)
				if !ok {
					return nil, fmt.Errorf("invalid type for \"match_pattern\": %T", value)
				}
				aDynamicTemplate.matchPattern = s
			case "match":
				values, err := parseDynamicTemplateParameter(value)
				if err != nil {
					logger.Warnf("failed to check match setting: %s", err)
					return nil, fmt.Errorf("failed to check match setting: %w", err)
				}
				aDynamicTemplate.match = values
			case "unmatch":
				values, err := parseDynamicTemplateParameter(value)
				if err != nil {
					return nil, fmt.Errorf("failed to check unmatch setting: %w", err)
				}
				aDynamicTemplate.unmatch = values
			case "path_match":
				values, err := parseDynamicTemplateParameter(value)
				if err != nil {
					return nil, fmt.Errorf("failed to check path_match setting: %w", err)
				}
				aDynamicTemplate.pathMatch = values
			case "path_unmatch":
				values, err := parseDynamicTemplateParameter(value)
				if err != nil {
					return nil, fmt.Errorf("failed to check path_unmatch setting: %w", err)
				}
				aDynamicTemplate.unpathMatch = values
			case "match_mapping_type", "unmatch_mapping_type":
				// Do nothing
				// These parameters require to check the original type (before the document is ingested)
				// but the dynamic template just contains the type from the `mapping` field
			default:
				return nil, fmt.Errorf("unexpected setting found in dynamic template")
			}
		}

		if isRuntime {
			continue
		}
		dynamicTemplates = append(dynamicTemplates, aDynamicTemplate)
	}

	return dynamicTemplates, nil
}