Files
go-caatsm/internal/adapter/parser/composite.go
T

70 lines
2.0 KiB
Go
Raw Normal View History

package parser
import (
"caatsm/internal/adapter/dto"
"caatsm/internal/domain/weather"
"caatsm/internal/port"
"fmt"
"time"
"github.com/google/uuid"
)
// CompositeParser combines multiple parsers (weather and aviation)
type CompositeParser struct {
aviationParser Parser
weatherParser port.WeatherParser
}
// NewCompositeParser creates a new composite parser
func NewCompositeParser(aviation Parser, weather port.WeatherParser) *CompositeParser {
return &CompositeParser{
aviationParser: aviation,
weatherParser: weather,
}
}
// Parse attempts to parse using multiple parsers
func (p *CompositeParser) Parse(rawText string) (*dto.ParsedTelegram, error) {
// 1. Try weather parser first
if p.weatherParser != nil && p.weatherParser.CanParse(rawText) {
wMsg, err := p.weatherParser.Parse(rawText)
if err == nil {
return p.weatherToTelegram(wMsg, rawText), nil
}
// If parsing fails, continue to aviation parser as fallback
}
// 2. Try aviation parser (existing logic)
return p.aviationParser.Parse(rawText)
}
// weatherToTelegram converts a WeatherMessage to ParsedTelegram
func (p *CompositeParser) weatherToTelegram(wMsg weather.WeatherMessage, raw string) *dto.ParsedTelegram {
parsed := dto.NewParsedTelegram()
parsed.Content = raw
parsed.Body = raw
parsed.Category = string(wMsg.Type())
parsed.BodyData = wMsg
parsed.Parsed = true
parsed.Status = dto.MessageStatusParsed
parsed.Uuid = uuid.New().String()
parsed.ReceivedAt = time.Now()
parsed.ParsedAt = time.Now()
// Extract basic information from weather message
switch msg := wMsg.(type) {
case *weather.Metar:
issueTime := msg.IssueTime()
parsed.MessageID = fmt.Sprintf("%s-%s", msg.Station(), issueTime.Format("20060102150405"))
parsed.DateTime = issueTime.Format("060102150405")
case *weather.Taf:
issueTime := msg.IssueTime()
parsed.MessageID = fmt.Sprintf("%s-%s", msg.Station(), issueTime.Format("20060102150405"))
parsed.DateTime = issueTime.Format("060102150405")
}
return parsed
}