Files

73 lines
1.4 KiB
Go

package main
import (
"encoding/json"
"fmt"
"io"
"os"
"strings"
)
type xkcd struct {
Num int `json:"num"`
Day string `json:"day"`
Month string `json:"month"`
Year string `json:"year"`
Title string `json:"title"`
Transcript string `json:"transcript"`
}
func main() {
if len(os.Args) < 2 {
fmt.Fprintln(os.Stderr, "No file was given")
os.Exit(-1)
}
filename := os.Args[1]
if len(os.Args) < 3 {
fmt.Fprintln(os.Stderr, "No search tags were given")
os.Exit(0)
}
var (
items []xkcd
terms []string
input io.ReadCloser
cnt int
err error
)
// okay so let's decode the file, get search terms and search
if input, err = os.Open(filename); err != nil {
fmt.Fprintf(os.Stderr, "Corrupt file: %s\n", err)
os.Exit(-1)
}
if err = json.NewDecoder(input).Decode(&items); err != nil {
fmt.Fprintf(os.Stderr, "Bad json Fromat: %s", err)
os.Exit(-1)
}
fmt.Fprintf(os.Stderr, "read %d comics\n", len(items))
for _, t := range os.Args[2:] {
terms = append(terms, strings.ToLower(t))
}
outer:
for _, item := range items {
title := strings.ToLower(item.Title)
transcript := strings.ToLower(item.Transcript)
for _, term := range terms {
if !strings.Contains(title, term) && !strings.Contains(transcript, term) {
continue outer
}
}
fmt.Printf("https://xkcd.com/%d/%s/%s/%s\n", item.Num, item.Day, item.Month, item.Year)
cnt++
}
fmt.Fprintf(os.Stderr, "found %d comics\n", cnt)
}