Files
go-caatsm/internal/parsers/schedule_parser.go
T
windyboy ebcca5c1ec refactor: Improve parsing of flight schedule data
The code changes in `schedule_parser.go` enhance the parsing logic for flight schedule data. This improves the accuracy and functionality of the code when extracting information such as index, task, date, flight number, and aircraft registration from the input line. The changes ensure more reliable and consistent parsing of flight schedule data.
2024-07-29 23:46:21 +08:00

108 lines
2.6 KiB
Go

package parsers
import (
"caatsm/internal/domain"
"regexp"
"strings"
)
const (
// DepartureCode = "dep"
// DepartureTime = "dep_time"
// ArrivalCode = "arr"
AirportCode = "airport"
Date = "date"
Task = "task"
IndexPattern = `(?P<idx>\(?L?\d+\)?\.?)`
DatePattern = `\s?(?P<date>\d{2}\w{3})`
TaskPattern = `\s?(?P<task>[A-Z]\/[A-Z])`
WaypointPattern = `\s?(?P<arr_time>\d{4}(\(\d{2}\w{3}\))?)\/?(?P<airport>\w{3})\/?(?P<dep_time>\d{4}(\(\d{2}\w{3}\))?)`
FlightNumberPattern = `\s?(?P<number>[0-9A-Z][A-Z]\d{3,5})`
RegisterPattern = `\s?(?P<reg>B\d{4})`
)
var (
IndexExpression = regexp.MustCompile(IndexPattern)
TaskExpression = regexp.MustCompile(TaskPattern)
DateExpression = regexp.MustCompile(DatePattern)
WaypointExpression = regexp.MustCompile(WaypointPattern)
FlightNumberExpression = regexp.MustCompile(FlightNumberPattern)
RegisterExpression = regexp.MustCompile(RegisterPattern)
parserMap = map[string]*regexp.Regexp{
Index: IndexExpression,
Task: TaskExpression,
Date: DateExpression,
FlightNumber: FlightNumberExpression,
Register: RegisterExpression,
}
)
func FindWaypoints(message string) map[string]string {
matches := WaypointExpression.FindStringSubmatch(message)
if matches == nil {
return nil
}
result := make(map[string]string)
for i, name := range WaypointExpression.SubexpNames() {
if i != 0 && name != "" {
result[name] = matches[i]
}
}
return result
}
func ParseLine(line string) *domain.FlightSchedule {
cleanLine := strings.TrimSpace(line)
words := strings.Split(cleanLine, " ")
var flightSchedule = &domain.FlightSchedule{}
var data map[string]string
// Define the parsing strategy
parseStrategy := []string{
Index,
Task,
Date,
FlightNumber,
Register,
}
// Track parsed fields to avoid re-parsing
parsed := make(map[string]bool)
for i, word := range words {
if i > 0 {
parsed[Index] = true
}
for _, name := range parseStrategy {
if parsed[name] {
continue
}
if data = parse(word, parserMap[name]); data != nil {
switch name {
case Index:
flightSchedule.Index = data[Index]
parsed[Index] = true
case Task:
flightSchedule.Task = data[Task]
parsed[Task] = true
case Date:
flightSchedule.Date = data[Date]
parsed[Date] = true
case FlightNumber:
flightSchedule.FlightNumber = data[FlightNumber]
parsed[FlightNumber] = true
case Register:
flightSchedule.AircraftReg = data[Register]
parsed[Register] = true
}
break
}
}
}
return flightSchedule
}