108 lines
3.7 KiB
Go
108 lines
3.7 KiB
Go
package vstp
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"git.fjla.uk/owlboard/go-types/pkg/upstreamApi"
|
|
"git.fjla.uk/owlboard/timetable-mgr/log"
|
|
)
|
|
|
|
// Simple type conversion
|
|
func convertCifType(in *upstreamApi.VSTPSchedule) (error, *upstreamApi.JsonScheduleV1) {
|
|
if in == nil {
|
|
return errors.New("input is nil"), nil
|
|
}
|
|
|
|
// Delete Message Example - Does not process as is.
|
|
// {"VSTPCIFMsgV1":{"schedule":{"transaction_type":"Delete","train_status":" ","schedule_start_date":"2024-04-29","schedule_end_date":"2024-04-29","schedule_days_runs":"1000000","CIF_train_uid":" 68613","CIF_stp_indicator":"N","CIF_bank_holiday_running":" "},"Sender":{"organisation":"Network Rail","application":"TSIA","component":"TSIA","userID":"#QJP0070","sessionID":"CT02000"},"classification":"industry","timestamp":"1714372444000","owner":"Network Rail","originMsgId":"2024-04-29T06:34:04-00:00@vstp.networkrail.co.uk"}}
|
|
|
|
out := &upstreamApi.JsonScheduleV1{
|
|
TransactionType: in.TransactionType,
|
|
CifBankHolidayRunning: in.CifBankHolidayRunning,
|
|
CifStpIndicator: in.CifStpIndicator,
|
|
CifTrainUid: in.CifTrainUid,
|
|
ApplicableTimetable: in.ApplicableTimetable,
|
|
ScheduleDaysRun: in.ScheduleDaysRun,
|
|
ScheduleStartDate: in.ScheduleStartDate,
|
|
ScheduleEndDate: in.ScheduleEndDate,
|
|
}
|
|
|
|
if len(in.ScheduleSegment) > 0 {
|
|
if len(in.ScheduleSegment) > 1 {
|
|
log.Warn("More than one element in schedule segment")
|
|
}
|
|
out.ScheduleSegment = convertSchedule(&in.ScheduleSegment[0])
|
|
if trim(in.ScheduleSegment[0].AtocCode) != "" {
|
|
out.AtocCode = in.ScheduleSegment[0].AtocCode
|
|
} else {
|
|
out.AtocCode = "UK"
|
|
}
|
|
return nil, out
|
|
} else {
|
|
log.Warn("VSTP Schedule Segment empty")
|
|
return errors.New("schedule segment empty"), nil
|
|
}
|
|
}
|
|
|
|
func convertSchedule(in *upstreamApi.VSTPScheduleSegment) upstreamApi.CifScheduleSegment {
|
|
out := upstreamApi.CifScheduleSegment{
|
|
SignallingId: in.SignallingId,
|
|
CifTrainCategory: in.CifTrainCategory,
|
|
CifHeadcode: in.CifHeadcode,
|
|
CifTrainServiceCode: in.CifTrainServiceCode,
|
|
CifBusinessSector: in.CifBusinessSector,
|
|
CifPowerType: in.CifPowerType,
|
|
CifTimingLoad: in.CifTimingLoad,
|
|
CifSpeed: in.CifSpeed,
|
|
CifOperatingCharacteristics: in.CifOperatingCharacteristics,
|
|
CifTrainClass: in.CifTrainClass,
|
|
CifSleepers: in.CifSleepers,
|
|
CifReservations: in.CifReservations,
|
|
CifCateringCode: in.CifCateringCode,
|
|
ScheduleLocation: *convertLocations(&in.ScheduleLocation),
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
func convertLocations(in *[]upstreamApi.VSTPScheduleLocation) *[]upstreamApi.CifScheduleLocation {
|
|
if in == nil {
|
|
log.Error("Input is nil")
|
|
return nil
|
|
}
|
|
|
|
cifLocations := make([]upstreamApi.CifScheduleLocation, len(*in))
|
|
|
|
for i, loc := range *in {
|
|
cifLoc := upstreamApi.CifScheduleLocation{
|
|
TiplocCode: trim(loc.Location.Tiploc.TiplocId),
|
|
Arrival: convertTime(trim(loc.Arrival)),
|
|
PublicArrival: convertTime(trim(loc.PublicArrival)),
|
|
Departure: convertTime(trim(loc.Departure)),
|
|
PublicDeparture: convertTime(trim(loc.PublicDeparture)),
|
|
Pass: convertTime(trim(loc.Pass)),
|
|
Path: trim(loc.Path),
|
|
Platform: trim(loc.Platform),
|
|
EngineeringAllowance: trim(loc.EngineeringAllowance),
|
|
PathingAllowance: trim(loc.PathingAllowance),
|
|
PerformanceAllowance: trim(loc.PerformanceAllowance),
|
|
}
|
|
|
|
cifLocations[i] = cifLoc
|
|
}
|
|
|
|
return &cifLocations
|
|
}
|
|
|
|
func convertTime(in string) string {
|
|
if len(in) < 4 {
|
|
return in
|
|
}
|
|
return in[:4]
|
|
}
|
|
|
|
func trim(s string) string {
|
|
return strings.TrimSpace(s)
|
|
}
|