func()

in internal/pkg/core/deployers/types/api.go [269:333]


func (r *Resource) parseURITemplate(uriTemplate string) (artifacts.URITemplateInfo, error) {
	parsedInfo := artifacts.URITemplateInfo{
		FullTemplate:  uriTemplate,
		PathParameters: []string{},
		QueryParameters: make(map[string]string),
	}

	// Split the URI template into path and query parts
	parts := strings.SplitN(uriTemplate, "?", 2)
	pathPart := parts[0]
	parsedInfo.PathTemplate = pathPart

	var queryPart string
	if len(parts) > 1 {
		queryPart = parts[1]
	}

	// Extract path parameters
	pathSegments := strings.Split(pathPart, "/")
	paramSet := make(map[string]bool) // To track duplicate parameters

	for _, segment := range pathSegments {
		matches := pathParamRegex.FindStringSubmatch(segment)
		if len(matches) > 1 {
			paramName := matches[1]
			if paramSet[paramName] {
				return artifacts.URITemplateInfo{}, fmt.Errorf("duplicate path parameter: %s in uri-template: %s", paramName, uriTemplate)
			}
			paramSet[paramName] = true
			parsedInfo.PathParameters = append(parsedInfo.PathParameters, paramName)
		} else if strings.Contains(segment, "{") || strings.Contains(segment, "}") {
			return artifacts.URITemplateInfo{}, fmt.Errorf("invalid path parameter format in segment: '%s' of uri-template: %s. Expected '{paramName}'", segment, uriTemplate)
		}
	}

	// Extract query parameters
	if queryPart != "" {
		queryPairs := strings.Split(queryPart, "&")
		for _, pair := range queryPairs {
			keyValue := strings.SplitN(pair, "=", 2)
			if len(keyValue) == 2 {
				key := keyValue[0]
				value := keyValue[1]
				if _, exists := parsedInfo.QueryParameters[key]; exists {
					return artifacts.URITemplateInfo{}, fmt.Errorf("duplicate query parameter: %s in uri-template: %s", key, uriTemplate)
				}

				// Check if value follows the format {value}
				if !strings.HasPrefix(value, "{") || !strings.HasSuffix(value, "}") {
					return artifacts.URITemplateInfo{}, fmt.Errorf("invalid query parameter value format: '%s' in uri-template: %s. Expected format 'queryparam={value}'", pair, uriTemplate)
				}

				// Remove curly braces from the value
				value = strings.TrimPrefix(value, "{")
				value = strings.TrimSuffix(value, "}")
				parsedInfo.QueryParameters[key] = value
			} else if len(keyValue) == 1 && keyValue[0] != "" {
				return artifacts.URITemplateInfo{}, fmt.Errorf("invalid query parameter format: '%s' in uri-template: %s. Expected 'key=value'", pair, uriTemplate)
			} else if len(keyValue) == 0 && pair != "" {
				return artifacts.URITemplateInfo{}, fmt.Errorf("invalid query parameter format: '%s' in uri-template: %s. Expected 'key=value'", pair, uriTemplate)
			}
		}
	}
	return parsedInfo, nil
}