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
}