package reader import ( "log" "os" "path/filepath" "git.tornberg.me/go-gtfs/pkg/types" ) type TripData struct { Stops map[string]*types.Stop Trips map[string]*types.Trip Routes map[string]*types.Route Agencies map[string]*types.Agency } func LoadTripData(path string) (*TripData, error) { tp := &TripData{ Stops: make(map[string]*types.Stop), Trips: make(map[string]*types.Trip), Routes: make(map[string]*types.Route), Agencies: make(map[string]*types.Agency), } files := []string{"agency", "routes", "stops", "trips", "stop_times", "transfers"} for _, file := range files { f, err := os.Open(filepath.Join(path, file+".txt")) if err != nil { log.Fatalf("failed to open %s: %v", file, err) } defer f.Close() switch file { case "agency": err = ParseAgencies(f, func(a types.Agency) { tp.Agencies[a.AgencyID] = &a }) case "routes": err = ParseRoutes(f, func(r types.Route) { tp.Routes[r.RouteID] = &r if ag, ok := tp.Agencies[r.AgencyID]; ok { r.SetAgency(ag) // ag.AddRoute(&r) } }) case "stops": err = ParseStops(f, func(s types.Stop) { tp.Stops[s.StopId] = &s }) case "trips": err = ParseTrips(f, func(t types.Trip) { trip := t if route, ok := tp.Routes[trip.RouteId]; ok { trip.SetRoute(route) route.AddTrip(&trip) } else { log.Printf("route %s not found", trip.RouteId) } if agency, ok := tp.Agencies[trip.AgencyID]; ok { trip.Agency = agency } else { log.Printf("agency %s not found", trip.AgencyID) } tp.Trips[trip.TripId] = &trip }) case "stop_times": err = ParseStopTimes(f, func(st types.StopTime) { stop, ok := tp.Stops[st.StopId] if ok { st.SetStop(stop) } else { log.Printf("stop %s not found", st.StopId) } trp, ok := tp.Trips[st.TripId] if !ok { log.Printf("trip %s not found", st.TripId) } else { stop.AddTrip(trp) trp.AddStopTime(&st) } }) case "transfers": err = ParseTransfers(f, func(tr types.Transfer) { //transfers = append(transfers, tr) stop, ok := tp.Stops[tr.FromStopId] if ok { stop.AddTransfer(&tr, tp.Stops[tr.ToStopId]) } else { log.Printf("stop %s not found for transfer", tr.FromStopId) } }) } if err != nil { return tp, err } } return tp, nil }