func()

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
			}
		}
	}
}