From 2af02142f49437bd675aff4d18334733fce2c3ad Mon Sep 17 00:00:00 2001 From: su55y Date: Sun, 16 Jun 2024 14:33:02 +0300 Subject: refactoring, error handling --- sixkcd.go | 119 +++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 51 deletions(-) diff --git a/sixkcd.go b/sixkcd.go index b9c13d7..f5f870d 100644 --- a/sixkcd.go +++ b/sixkcd.go @@ -7,7 +7,6 @@ import ( _ "image/png" _ "image/jpeg" "io" - "log" "math/rand" "net/http" "os" @@ -58,83 +57,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 } -- cgit v1.2.3