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 }