package main import ( "encoding/json" "errors" "net/http" "os" "sort" "time" ) const CropBottom = "bottom" var ErrNon200Error = errors.New("non 200 status code") type PendingImage struct { Date time.Time `json:"date"` URL string `json:"url"` Crop string `json:"crop"` } func LoadPendingImageFromURL(url string) (pi PendingImage, err error) { resp, err := http.Get(url) if err != nil { return PendingImage{}, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return PendingImage{}, ErrNon200Error } if err := json.NewDecoder(resp.Body).Decode(&pi); err != nil { return PendingImage{}, err } return pi, nil } type PendingImages struct { Images []PendingImage `json:"images"` } func (pi PendingImages) FindPendingImage() (bestImg PendingImage, ok bool) { timeNow := time.Now().UTC() if len(pi.Images) == 0 { return PendingImage{}, false } for _, img := range pi.Images { if timeNow.Before(img.Date) { continue } bestImg = img } return bestImg, bestImg.URL != "" } func LoadPendingImages(jsonFile string) (pi PendingImages, _ error) { f, err := os.Open(jsonFile) if err != nil { return PendingImages{}, err } defer f.Close() if err := json.NewDecoder(f).Decode(&pi); err != nil { return PendingImages{}, err } sort.Slice(pi.Images, func(i, j int) bool { return pi.Images[i].Date.Before(pi.Images[j].Date) }) return pi, nil }