package broker import ( "encoding/json" "errors" "fmt" "io" "local/truckstop/config" "time" ) type NTGVision struct { searcher interface { search(states []config.State) (io.ReadCloser, error) } } type ntgVisionJob struct { ID int64 `json:"id"` PickupDate string `json:"sDate"` PickupCity string `json:"sCity"` PickupState string `json:"sState"` DropoffDate string `json:"cDate"` DropoffCity string `json:"cCity"` DropoffState string `json:"cState"` Miles int `json:"miles"` Weight int `json:"weight"` Equipment string `json:"equip"` Temp string `json:"temp"` } func (ntgJob ntgVisionJob) Job() Job { pickup, _ := time.ParseInLocation("01/02/06", ntgJob.PickupDate, time.Local) dropoff, _ := time.ParseInLocation("01/02/06", ntgJob.DropoffDate, time.Local) return Job{ ID: fmt.Sprintf("ntg-%d", ntgJob.ID), Pickup: JobLocation{ Date: pickup, City: ntgJob.PickupCity, State: ntgJob.PickupState, }, Dropoff: JobLocation{ Date: dropoff, City: ntgJob.DropoffCity, State: ntgJob.DropoffState, }, Miles: ntgJob.Miles, Weight: ntgJob.Weight, Meta: fmt.Sprintf("equipment:%s", ntgJob.Equipment), } } func NewNTGVision() NTGVision { ntgv := NTGVision{} ntgv.searcher = ntgv return ntgv } func (ntg NTGVision) WithMock() NTGVision { ntg.searcher = NewNTGVisionMock() return ntg } func (ntg NTGVision) search(states []config.State) (io.ReadCloser, error) { return nil, errors.New("not impl: ntg.search") } func (ntg NTGVision) Search(states []config.State) ([]Job, error) { rc, err := ntg.searcher.search(states) if err != nil { return nil, err } defer rc.Close() var ntgjobs []ntgVisionJob err = json.NewDecoder(rc).Decode(&ntgjobs) jobs := make([]Job, len(ntgjobs)) for i := range jobs { jobs[i] = ntgjobs[i].Job() } return jobs, err }