in internal/pkg/core/deployers/types/api.go [193:267]
func (r *Resource) decodeSequence(decoder *xml.Decoder, position artifacts.Position, sequenceType string, res artifacts.Resource) (artifacts.Sequence, error) {
line, _ := decoder.InputPos()
position = artifacts.Position{
FileName: position.FileName,
LineNo: line,
Hierarchy: position.Hierarchy + "->" + res.URITemplate.FullTemplate + "->" + sequenceType,
}
// Check if the next element is a sequence tag
for {
token, err := decoder.Token()
if err != nil {
return artifacts.Sequence{}, err
}
if startElem, ok := token.(xml.StartElement); ok {
if startElem.Name.Local == "sequence" {
// Handle nested sequence format
decodeSeq := Sequence{}
seq, err := decodeSeq.unmarshal(decoder, position)
if err != nil {
return artifacts.Sequence{}, err
}
return seq, nil
} else {
// Handle direct mediators format
var mediatorList []artifacts.Mediator
if position.Hierarchy == "" {
position.Hierarchy = sequenceType
}
// Process the first element we found
switch startElem.Name.Local {
case "log":
logMediator := LogMediator{}
mediator, err := logMediator.Unmarshal(decoder, startElem, position)
if err != nil {
return artifacts.Sequence{}, err
}
mediatorList = append(mediatorList, mediator)
}
// Continue processing other elements
OuterLoop:
for {
token, err := decoder.Token()
if err != nil {
break
}
line, _ := decoder.InputPos()
position := artifacts.Position{LineNo: line, FileName: position.FileName, Hierarchy: position.Hierarchy}
switch element := token.(type) {
case xml.StartElement:
switch element.Name.Local {
case "log":
logMediator := LogMediator{}
mediator, err := logMediator.Unmarshal(decoder, element, position)
if err != nil {
return artifacts.Sequence{}, err
}
mediatorList = append(mediatorList, mediator)
}
case xml.EndElement:
// Stop when the </sequence> tag is encountered
if element.Name.Local == sequenceType {
break OuterLoop
}
}
}
return artifacts.Sequence{MediatorList: mediatorList, Position: position}, nil
}
}
}
}