Files
go-caatsm/internal/parsers/aviation_parser.go
T

78 lines
2.0 KiB
Go

package parsers
import (
"caatsm/internal/domain"
"strings"
)
// ParseHeader parses the header of the message and returns a ParsedMessage struct
func ParseHeader(fullMessage string) domain.ParsedMessage {
var (
startIndicator string
messageID string
dateTime string
priorityIndicator string
primaryAddress string
secondaryAddresses []string
originator string
originatorDateTime string
bodyAndFooter strings.Builder
headerEnded bool
)
fullMessage = strings.TrimSpace(fullMessage)
lines := strings.Split(fullMessage, "\n")
for lineCounter, line := range lines {
switch lineCounter {
case 0:
if strings.HasPrefix(line, "ZCZC") {
parts := strings.Fields(line)
if len(parts) >= 3 {
startIndicator = parts[0]
messageID = parts[1]
dateTime = parts[2]
}
}
case 1:
parts := strings.Fields(line)
if len(parts) >= 2 {
priorityIndicator = parts[0]
primaryAddress = parts[1]
}
default:
if !headerEnded {
if strings.TrimSpace(line) == "." {
continue
} else if strings.HasPrefix(line, ".") {
originatorInfo := strings.Fields(line[1:])
if len(originatorInfo) >= 2 {
originator = originatorInfo[0]
originatorDateTime = originatorInfo[1]
}
headerEnded = true
} else if strings.HasPrefix(line, "BEGIN PART") || strings.HasPrefix(line, "(") {
headerEnded = true
bodyAndFooter.WriteString(line + "\n")
} else {
secondaryAddresses = append(secondaryAddresses, line)
}
} else {
bodyAndFooter.WriteString(line + "\n")
}
}
}
return domain.ParsedMessage{
StartIndicator: startIndicator,
MessageID: messageID,
DateTime: dateTime,
PriorityIndicator: priorityIndicator,
PrimaryAddress: primaryAddress,
SecondaryAddresses: secondaryAddresses,
Originator: originator,
OriginatorDateTime: originatorDateTime,
BodyAndFooter: bodyAndFooter.String(),
}
}