package main import ( "encoding/json" "errors" "fmt" "io" "log" "net/http" "os" "time" ) type Quote struct { Quote string `json:"quote"` Author string `json:"author"` } func (q Quote) PrintQuote() { fmt.Printf("\"%s\"\n\t- %s\n", q.Quote, q.Author) } func GetResponse() (*http.Response, error) { var url string = "https://dummyjson.com/quotes/random" var res *http.Response var err error var attempts int = 4 for attempts != 0 { res, err = http.Get(url) if err != nil { fmt.Fprintln(os.Stderr, "error encountered... trying again") time.Sleep(2 * time.Second) attempts-- continue } if res.StatusCode != 200 { fmt.Fprintf(os.Stderr, "the API returned but a 200, so I will be running this again in a few seconds") time.Sleep(2 * time.Second) attempts-- continue } if res.StatusCode == 200 { return res, nil } } if err != nil { return nil, err } if res.StatusCode != 200 { return nil, errors.New("gave up attempting to get 200") } return res, nil } func GetBodyFromResponse(res *http.Response) ([]byte, error) { var body []byte var err error defer res.Body.Close() body, err = io.ReadAll(res.Body) if err != nil { return nil, err } return body, nil } func NewQuoteFromBody(body []byte) (Quote, error) { var quote Quote if err := json.Unmarshal(body, "e); err != nil { return Quote{}, err } return quote, nil } func main() { var err error var res *http.Response res, err = GetResponse() if err != nil { log.Fatalln(err) } var body []byte body, err = GetBodyFromResponse(res) if err != nil { log.Fatalln(err) } var quote Quote quote, err = NewQuoteFromBody(body) if err != nil { log.Fatalln(err) } quote.PrintQuote() }