104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
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
|
|
}
|