func()

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
}