diff --git a/internal/parsers/schedule_def.go b/internal/parsers/schedule_def.go index 413e30d..86f7cab 100644 --- a/internal/parsers/schedule_def.go +++ b/internal/parsers/schedule_def.go @@ -14,7 +14,7 @@ const ( // CK task: 01)H/Z TaskPattern = `(?P[A-Z]\/[A-Z])$` WaypointPattern = `^(SI:)?(?P\d{4}(\(\d{2}[A-Z]{3}\))?)?\/?(?P[A-Z]{3})\/?(?P\d{4}(\(\d{2}[A-Z]{3}\))?)?$` - FlightNumberPattern = `^(?P[0-9A-Z][0-9A-Z]\d{3,5})$` + FlightNumberPattern = `^(?P[0-9A-Z][0-9A-Z]\d{3,5}(\/\d+)*)$` RegisterPattern = `^(?PB\d{4})$` ) @@ -236,6 +236,51 @@ var ( 3: Register, }, }, + { + /** + * 山东航空 (SC) + *(1) SC4717 B3080 CRJ7 ILS I (6) TAO/2350 TSN + */ + Airlines: []string{"SC"}, + MinLen: 9, + WaypointStart: 7, + Fields: map[int]string{ + 0: Index, + 1: FlightNumber, + 2: Register, + }, + }, + { + /** + * 西部航空 (PN) + *21) PN6237 B6763 ILS I(9) CKG/0000 0220/TSN + *23) PN6235 B6763 ILS I(9) CKG/0905 1025/WUH/1100 1225/WNZ + */ + Airlines: []string{"PN"}, + MinLen: 7, + WaypointStart: 5, + Fields: map[int]string{ + 0: Index, + 1: FlightNumber, + 2: Register, + }, + }, + { + /** + * 南方航空 (CZ) + * + *83. CZ3301/2 B2823 B752 CAN0135 TSN0535 CAN + *02. CZ6973/4 B5239 B737 YIN0235 URC0425 PVG0940 URC1545 YIN + */ + Airlines: []string{"CZ"}, + MinLen: 6, + WaypointStart: 4, + Fields: map[int]string{ + 0: Index, + 1: FlightNumber, + 2: Register, + }, + }, } ) diff --git a/internal/parsers/schedule_parser.go b/internal/parsers/schedule_parser.go index e97deea..93123b5 100644 --- a/internal/parsers/schedule_parser.go +++ b/internal/parsers/schedule_parser.go @@ -143,8 +143,7 @@ func ParseLine(line string) *domain.ScheduleLine { parsed[Date] = true maxParsed = i case FlightNumber: - //TODO: Handle multiple flight numbers - flightSchedule.FlightNumber = append(flightSchedule.FlightNumber, data[FlightNumber]) + flightSchedule.FlightNumber = getFlightNumbers(data[FlightNumber]) parsed[FlightNumber] = true maxParsed = i case Register: @@ -205,3 +204,30 @@ func parseWaypoints(points []string) []domain.WayPoint { // log.Debugf("Found %d waypoints", len(waypoints)) return waypoints } + +/** +* CZ6794/79 +* CZ3301/2 +* CA1371/1372/1527 + */ +func getFlightNumbers(data string) []string { + // matchNumbers := extract(data, FlightNumberExpression) + // numbers := matchNumbers[FlightNumber] + // if numbers == "" { + // return nil + // } + if strings.Contains(data, "/") { + data := strings.Split(data, "/") + baseNumber := data[0] + baseLength := len(baseNumber) + flightNumbers := append([]string{}, baseNumber) + for _, number := range data[1:] { + length := len(number) + flightNumber := baseNumber[:baseLength-length] + number + flightNumbers = append(flightNumbers, flightNumber) + } + return flightNumbers + } else { + return []string{data} + } +} diff --git a/internal/parsers/schedule_parser_test.go b/internal/parsers/schedule_parser_test.go index 5c04fe6..204ac95 100644 --- a/internal/parsers/schedule_parser_test.go +++ b/internal/parsers/schedule_parser_test.go @@ -113,6 +113,29 @@ var _ = Describe("Schedule Parser", func() { Expect(data[FlightNumber]).To(Equal("9C8812")) }) }) + + Context("CA1371/1372/1527", func() { + It("3 number : CA1371 CA1372 CA1527", func() { + message := "CA1371/1372/1527" + data := getFlightNumbers(message) + Expect(data).NotTo(BeNil()) + Expect(data).To(HaveLen(3)) + Expect(data).To(ContainElement("CA1371")) + Expect(data).To(ContainElement("CA1372")) + Expect(data).To(ContainElement("CA1527")) + }) + }) + + Context("CZ3301/2", func() { + It("2 number : CZ3301 CZ3302", func() { + message := "CZ3301/2" + data := getFlightNumbers(message) + Expect(data).NotTo(BeNil()) + Expect(data).To(HaveLen(2)) + Expect(data).To(ContainElement("CZ3301")) + Expect(data).To(ContainElement("CZ3302")) + }) + }) }) Describe("Schedule Date Parser", func() { @@ -465,4 +488,22 @@ var _ = Describe("Parse Line with PreDef", func() { }) }) + Context("SC", func() { + It("(1) SC4717 B3080 CRJ7 ILS I (6) TAO/2350 TSN", func() { + lineText := "(1) SC4717 B3080 CRJ7 ILS I (6) TAO/2350 TSN" + def := FindDef("SC") + Expect(def).NotTo(BeNil()) + schedule := ParseWithDef(lineText, def) + Expect(schedule).NotTo(BeNil()) + Expect(schedule.Index).To(Equal("(1)")) + Expect(len(schedule.FlightNumber)).To(Equal(1)) + Expect(schedule.FlightNumber[0]).To(Equal("SC4717")) + Expect(schedule.AircraftReg).To(Equal("B3080")) + Expect(len(schedule.Waypoints)).To(Equal(2)) + Expect(schedule.Waypoints[0].Airport).To(Equal("TAO")) + Expect(schedule.Waypoints[0].DepartureTime).To(Equal("2350")) + Expect(schedule.Waypoints[1].Airport).To(Equal("TSN")) + }) + }) + })