diff --git a/gtfs/stop_time.go b/gtfs/stop_time.go index d166d40f..8f5afd0e 100644 --- a/gtfs/stop_time.go +++ b/gtfs/stop_time.go @@ -2,7 +2,6 @@ package gtfs import ( "fmt" - "strconv" "github.com/interline-io/transitland-lib/causes" "github.com/interline-io/transitland-lib/tt" @@ -121,72 +120,40 @@ func (ent *StopTime) SetString(key, value string) error { case "stop_id": ent.StopID.Set(hi) case "arrival_time": - if hi == "" { - } else if s, err := tt.NewSecondsFromString(hi); err != nil { + if err := ent.ArrivalTime.Scan(hi); err != nil { perr = causes.NewFieldParseError("arrival_time", hi) - } else { - ent.ArrivalTime = s } case "departure_time": - if hi == "" { - } else if s, err := tt.NewSecondsFromString(hi); err != nil { + if err := ent.DepartureTime.Scan(hi); err != nil { perr = causes.NewFieldParseError("departure_time", hi) - } else { - ent.DepartureTime = s } case "stop_sequence": - if a, err := strconv.Atoi(hi); err != nil { + if err := ent.StopSequence.Scan(hi); err != nil { perr = causes.NewFieldParseError("stop_sequence", hi) - } else { - ent.StopSequence.Set(int64(a)) } case "pickup_type": - if hi == "" { - ent.PickupType = tt.Int{} - } else if a, err := strconv.Atoi(hi); err != nil { + if err := ent.PickupType.Scan(hi); err != nil { perr = causes.NewFieldParseError("pickup_type", hi) - } else { - ent.PickupType.SetInt(a) } case "drop_off_type": - if hi == "" { - ent.DropOffType = tt.Int{} - } else if a, err := strconv.Atoi(hi); err != nil { + if err := ent.DropOffType.Scan(hi); err != nil { perr = causes.NewFieldParseError("drop_off_type", hi) - } else { - ent.DropOffType.SetInt(a) } case "continuous_pickup": - if hi == "" { - ent.ContinuousPickup = tt.Int{} - } else if a, err := strconv.Atoi(hi); err != nil { + if err := ent.ContinuousPickup.Scan(hi); err != nil { perr = causes.NewFieldParseError("continuous_pickup", hi) - } else { - ent.ContinuousPickup.SetInt(a) } case "continuous_drop_off": - if hi == "" { - ent.ContinuousDropOff = tt.Int{} - } else if a, err := strconv.Atoi(hi); err != nil { + if err := ent.ContinuousDropOff.Scan(hi); err != nil { perr = causes.NewFieldParseError("continuous_drop_off", hi) - } else { - ent.ContinuousDropOff.SetInt(a) } case "shape_dist_traveled": - if hi == "" { - ent.ShapeDistTraveled = tt.Float{} - } else if a, err := strconv.ParseFloat(hi, 64); err != nil { + if err := ent.ShapeDistTraveled.Scan(hi); err != nil { perr = causes.NewFieldParseError("shape_dist_traveled", hi) - } else { - ent.ShapeDistTraveled.Set(a) } case "timepoint": - if hi == "" { - ent.Timepoint = tt.Int{} - } else if a, err := strconv.Atoi(hi); err != nil { + if err := ent.Timepoint.Scan(hi); err != nil { perr = causes.NewFieldParseError("timepoint", hi) - } else { - ent.Timepoint.SetInt(a) } default: ent.SetExtra(key, hi) diff --git a/tt/option_convert.go b/tt/option_convert.go index f4f6bae0..d84d1555 100644 --- a/tt/option_convert.go +++ b/tt/option_convert.go @@ -124,6 +124,17 @@ func TryCsv(val any) string { return a } +func checkFloatInteger(s string) (float64, error) { + c, err := strconv.ParseFloat(s, 64) + if err != nil { + return c, err + } + if c != math.Trunc(c) { + return c, fmt.Errorf("cannot convert non-integer float to int64") + } + return c, nil +} + func convertAssign(dest any, src any) (bool, error) { if src == nil { return false, nil @@ -156,9 +167,17 @@ func convertAssign(dest any, src any) (bool, error) { case *int: switch s := src.(type) { case string: - *d, err = strconv.Atoi(s) + c, e := checkFloatInteger(s) + if e != nil { + err = e + } + *d = int(c) case []byte: - *d, err = strconv.Atoi(string(s)) + c, e := checkFloatInteger(string(s)) + if e != nil { + err = e + } + *d = int(c) case int: *d = int(s) case int64: @@ -173,9 +192,17 @@ func convertAssign(dest any, src any) (bool, error) { case *int64: switch s := src.(type) { case string: - *d, err = strconv.ParseInt(s, 10, 64) + c, e := checkFloatInteger(s) + if e != nil { + err = e + } + *d = int64(c) case []byte: - *d, err = strconv.ParseInt(string(s), 10, 64) + c, e := checkFloatInteger(string(s)) + if e != nil { + err = e + } + *d = int64(c) case int: *d = int64(s) case int64: