in internal/pkg/core/deployers/types/api.go [126:191]
func (r *Resource) Unmarshal(decoder *xml.Decoder, start xml.StartElement, position artifacts.Position) (artifacts.Resource, error) {
// Extract attributes from the <resource> element
res := artifacts.Resource{}
var methodsStr string
var uriTemplate string
for _, attr := range start.Attr {
switch attr.Name.Local {
case "methods":
methodsStr = attr.Value
case "uri-template":
uriTemplate = attr.Value
}
}
// Split the methods string into a slice (e.g., "GET POST PUT" -> ["GET", "POST", "PUT"])
if methodsStr != "" {
res.Methods = strings.Fields(methodsStr)
}
// Parse the URI template if provided
if uriTemplate != "" {
// Parse and validate the URI template
parsedInfo, err := r.parseURITemplate(uriTemplate)
if err != nil {
return artifacts.Resource{}, fmt.Errorf("invalid URI template '%s': %w", uriTemplate, err)
}
// Store the parsed URI template info in the artifacts.Resource
res.URITemplate = parsedInfo
}
// Process child elements - use a labeled loop for cleaner exiting
parsingLoop:
for {
token, err := decoder.Token()
if err != nil {
break
}
switch elem := token.(type) {
case xml.StartElement:
switch elem.Name.Local {
case "inSequence", "faultSequence":
seq, err := r.decodeSequence(decoder, position, elem.Name.Local, res)
if err != nil {
return artifacts.Resource{}, err
}
if elem.Name.Local == "inSequence" {
res.InSequence = seq
} else {
res.FaultSequence = seq
}
default:
// Skip unknown elements
if err := decoder.Skip(); err != nil {
return artifacts.Resource{}, err
}
}
case xml.EndElement:
// Stop when the </resource> tag is encountered
if elem.Name.Local == "resource" {
break parsingLoop
}
}
}
return res, nil
}