86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package parser
|
||||
|
|
|
|||
|
|
import (
|
|||
|
|
"errors"
|
|||
|
|
"regexp"
|
|||
|
|
"strings"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
FlopRegex = `(?m)\((?P<type>\w{3}).*(.|\n|\r).*\)`
|
|||
|
|
DestinationRegex = `(?P<dest>\w+)(?P<time>\d{0,4})?`
|
|||
|
|
DOFRegex = `(?m)DOF\/(?P<time>\d{6})`
|
|||
|
|
TypeArrival = "ARR"
|
|||
|
|
TypeDeparture = "DEP"
|
|||
|
|
TypeFlightPlan = "FPL"
|
|||
|
|
TypeDelay = "DLA"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var flopRegex = regexp.MustCompile(FlopRegex)
|
|||
|
|
|
|||
|
|
func parseArrOrDep(telegram *Telegram, data string) {
|
|||
|
|
/**
|
|||
|
|
* example:
|
|||
|
|
* (ARR-CSN3126/A5040-ZSPD-ZBTJ1601)
|
|||
|
|
* (DEP-CSN3125/A4553-ZGHA0554-ZBTJ-DOF/120820)
|
|||
|
|
*/
|
|||
|
|
values := getSplitValues(data)
|
|||
|
|
l := len(values)
|
|||
|
|
if l < 4 {
|
|||
|
|
telegram.ParseErrors = append(telegram.ParseErrors, errors.New("arrival data less than 4 "))
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
telegram.FlightNumber, telegram.RegisterNumber = parseFlight(values[1])
|
|||
|
|
telegram.Departure, telegram.DepartureTime = getAirportAndTime(values[2])
|
|||
|
|
telegram.Destination, telegram.DestinationTime = getAirportAndTime(values[3])
|
|||
|
|
if l == 5 {
|
|||
|
|
parseDof(telegram, values[4])
|
|||
|
|
}
|
|||
|
|
telegram.Parsed = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func parseFlightPlan(telegram *Telegram, data string) {
|
|||
|
|
/**
|
|||
|
|
* example:
|
|||
|
|
* (FPL-AAR997-IS
|
|||
|
|
* -B763/H-SDHIPRWZ/S
|
|||
|
|
* -RKSI0120
|
|||
|
|
* -N0473F320 NOPIK1B NOPIK G597 GONAV/N0473F320 G597 AGAVO/K0876S0980
|
|||
|
|
* G597 DONVO A326 ANRAT ANRAT2A
|
|||
|
|
* -ZBTJ0126 ZBAA
|
|||
|
|
* -EET/ZSHA0025 ZYSH0039 ZBPE0059 REG/HL7507 SEL/KRHJ OPR/AAR
|
|||
|
|
* DOF/090516 RMK/TCAS II EQUIPPED NAV/RNAV1 RNAV5 STS/CARGO)
|
|||
|
|
* NNNN
|
|||
|
|
*/
|
|||
|
|
values := getSplitValues(data)
|
|||
|
|
telegram.FlightNumber = values[1]
|
|||
|
|
telegram.Plane = values[3]
|
|||
|
|
telegram.Departure, telegram.DepartureTime = getAirportAndTime(values[5])
|
|||
|
|
destString := strings.Split(values[7], " ")
|
|||
|
|
telegram.Destination, telegram.DestinationTime = getAirportAndTime(destString[0])
|
|||
|
|
parseDof(telegram, values[8])
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func parseDelay(telegram *Telegram, data string) {
|
|||
|
|
/**
|
|||
|
|
* sample:
|
|||
|
|
* (DLA‐ABC123‐NZAA0145‐VTBS‐DOF/091120)
|
|||
|
|
*/
|
|||
|
|
values := getSplitValues(data)
|
|||
|
|
telegram.FlightNumber = values[1]
|
|||
|
|
telegram.Departure, telegram.DepartureTime = getAirportAndTime(values[2])
|
|||
|
|
telegram.Destination, telegram.DestinationTime = getAirportAndTime(values[3])
|
|||
|
|
if len(values) == 5 {
|
|||
|
|
parseDof(telegram, values[4])
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func parseDof(telegram *Telegram, text string) {
|
|||
|
|
if dof := getFields(DOFRegex, text); len(dof) == 1 {
|
|||
|
|
telegram.DateOfFlight, _ = time.Parse("060102", dof["time"])
|
|||
|
|
}
|
|||
|
|
}
|