This repository has been archived on 2021-12-17. You can view files and clone it, but cannot push or open issues/pull-requests.
falseknees/cmd/falseknees/main.go

103 lines
1.8 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"io"
"net/http"
"os"
"strconv"
"git.birbmc.com/Etzelia/falseknees"
)
var (
randomFlag bool
imageFlag bool
outFlag string
)
func main() {
flag.BoolVar(&randomFlag, "random", false, "get a random comic")
flag.BoolVar(&imageFlag, "image", false, "get the image response for a comic")
flag.StringVar(&outFlag, "out", "", "where to write the response (default: stdout)")
flag.Parse()
comicNum := 0
if flag.NArg() > 0 {
arg := flag.Arg(0)
i, err := strconv.Atoi(arg)
if err != nil {
fmt.Printf("Specific comic must be a number: %v\n", err)
return
}
comicNum = i
}
out := os.Stdout
if outFlag != "" {
fi, err := os.Create(outFlag)
if err != nil {
fmt.Printf("Could not create file %s: %v\n", outFlag, err)
return
}
defer fi.Close()
out = fi
}
if err := run(comicNum, out); err != nil {
fmt.Println(err)
}
}
func run(comicNum int, out io.WriteCloser) error {
client := falseknees.New()
var comic *falseknees.Comic
var err error
if randomFlag {
comic, err = client.Random(context.Background())
} else if comicNum == 0 {
comic, err = client.Current(context.Background())
} else {
comic, err = client.Comic(context.Background(), comicNum)
}
if err != nil {
return err
}
if imageFlag {
return image(comic.Img, out)
}
format := `Comic: %d
Title: %s
Image: %s
`
if _, err := fmt.Fprintf(out, format,
comic.Num,
comic.Title,
comic.Img); err != nil {
return err
}
return nil
}
func image(img string, out io.WriteCloser) error {
req, err := http.NewRequest(http.MethodGet, img, nil)
if err != nil {
return err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if _, err := io.Copy(out, resp.Body); err != nil {
return err
}
return nil
}