2024-08-11 22:44:19 +01:00
|
|
|
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() {
|
2024-08-27 00:38:16 +01:00
|
|
|
fmt.Printf("\"%s\"\n\t- %s\n", q.Quote, q.Author)
|
2024-08-11 22:44:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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, "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
|
|
|
|
var err error
|
|
|
|
|
|
|
|
err = json.Unmarshal(body, "e)
|
|
|
|
if 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()
|
|
|
|
}
|