summaryrefslogtreecommitdiff
path: root/sixkcd.go
diff options
context:
space:
mode:
authorBenjamin Chausse <benjamin@chausse.xyz>2024-06-16 10:43:52 -0400
committerGitHub <noreply@github.com>2024-06-16 10:43:52 -0400
commit91392a260137ceb324d1470abbe7724437c032d0 (patch)
tree0ba48a9704b0c5e94d8e965b4417add0e1d560d2 /sixkcd.go
parent1f5af9b941ac429d485ebcc80c17b5a6862f5a64 (diff)
parent2af02142f49437bd675aff4d18334733fce2c3ad (diff)
Merge pull request #1 from su55y/master
refactoring, error handling
Diffstat (limited to 'sixkcd.go')
-rw-r--r--sixkcd.go119
1 files changed, 68 insertions, 51 deletions
diff --git a/sixkcd.go b/sixkcd.go
index 9fdfdc9..3bc64b6 100644
--- a/sixkcd.go
+++ b/sixkcd.go
@@ -7,7 +7,6 @@ import (
_ "image/png"
_ "image/jpeg"
"io"
- "log"
"math/rand"
"net/http"
"os"
@@ -61,83 +60,101 @@ func main() {
Usage: "Output only the sixel image without the title or the alternate caption.",
},
},
- Action: func(ctx *cli.Context) error {
- comic := fetchComic("latest")
- switch ctx.String("id") {
- case "0":
- // Latest is already fetched
- break
- case "":
- // Random
- rand := rand.Intn(comic.Num+1)
- comic = fetchComic(strconv.Itoa(rand))
- default:
- comic = fetchComic(ctx.String("id"))
- }
- var img image.Image = fetchImg(comic.Img)
-
- encoder := sixel.NewEncoder(os.Stdout)
-
- switch ctx.Bool("raw") {
- case true:
- _ = encoder.Encode(img)
- default:
- fmt.Println("Title: ", comic.Title)
- _ = encoder.Encode(img)
- if comic.Alt != "" {
- fmt.Println(comic.Alt)
- }
- }
-
-
- return nil
- },
+ Action: appAction,
}
if err := app.Run(os.Args); err != nil {
- log.Fatal(err)
+ fmt.Printf("Error: %s\n", err.Error())
+ os.Exit(1)
}
}
-func fetchComic(id string) Comic {
- var res *http.Response
+func appAction(ctx *cli.Context) error {
+ var comic *Comic
+ var fetchErr error
+
+ comic, fetchErr = fetchComic("latest")
+ if fetchErr != nil {
+ return fetchErr
+ }
+
+ switch ctx.String("id") {
+ case "0":
+ // Latest is already fetched
+ break
+ case "":
+ // Random
+ rand := rand.Intn(comic.Num+1)
+ comic, fetchErr = fetchComic(strconv.Itoa(rand))
+ default:
+ comic, fetchErr = fetchComic(ctx.String("id"))
+ }
+
+ if fetchErr != nil {
+ return fetchErr
+ }
- var err error
+ img, err := fetchImg(comic.Img)
+ if err != nil {
+ return err
+ }
+
+ isRaw := ctx.Bool("raw")
+ if !isRaw {
+ fmt.Println("Title: ", comic.Title)
+ }
+
+ if err := sixel.NewEncoder(os.Stdout).Encode(img); err != nil {
+ return err
+ }
+ if !isRaw && comic.Alt != "" {
+ fmt.Println(comic.Alt)
+ }
+
+ return nil
+}
+
+func fetchComic(id string) (*Comic, error){
+ comicUrl := hostname+"/"+id+"/"+target
if id == "latest" {
- res, err = http.Get(hostname+"/"+target)
- } else {
- res, err = http.Get(hostname+"/"+id+"/"+target)
+ comicUrl = hostname+"/"+target
}
- defer res.Body.Close()
+ res, err := http.Get(comicUrl)
if err != nil {
- log.Fatal(err)
+ return nil, err
+ }
+ defer res.Body.Close()
+
+ if res.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("GET %s status code: %d", comicUrl, res.StatusCode)
}
content, err := io.ReadAll(res.Body)
if err != nil {
- log.Fatal(err)
+ return nil, err
}
+
comic := Comic{}
- err = json.Unmarshal(content, &comic)
- if err != nil {
- log.Fatal(err)
+ if err := json.Unmarshal(content, &comic); err != nil {
+ return nil, err
}
- return comic
+ return &comic, nil
}
-func fetchImg(url string) image.Image {
+func fetchImg(url string) (image.Image, error) {
res, err := http.Get(url)
if err != nil {
- log.Fatal(err)
+ return nil, err
}
+ defer res.Body.Close()
+
img, _, err := image.Decode(res.Body)
if err != nil {
- log.Fatal(err)
+ return nil, err
}
- res.Body.Close()
- return img
+ return img, nil
}