Sfoglia il codice sorgente

Follow the `next` link and collect the results

Lucas Stadler 10 anni fa
parent
commit
0b7ba6d386
1 ha cambiato i file con 45 aggiunte e 46 eliminazioni
  1. 45 46
      go/unpaginate/unpaginate.go

+ 45 - 46
go/unpaginate/unpaginate.go

@ -20,69 +20,68 @@ func main() {
20 20
	}
21 21
22 22
	url := flag.Arg(0)
23
	res, err := http.Get(url)
24
	if err != nil {
25
		fmt.Println(err)
26
		os.Exit(1)
27
	}
28
29
	decoder := json.NewDecoder(res.Body)
30
	_, err = decoder.Token()
31
	if err != nil {
32
		fmt.Println(err)
33
		os.Exit(1)
34
	}
35 23
36 24
	os.Stdout.WriteString("[\n")
37 25
38
	first := true
39
	for decoder.More() {
40
		if !first {
41
			os.Stdout.WriteString(", ")
42
		} else {
43
			first = false
44
		}
45
46
		var data interface{}
47
		err := decoder.Decode(&data)
26
	for url != "" {
27
		res, err := http.Get(url)
48 28
		if err != nil {
49
			fmt.Println("decode:", err)
29
			fmt.Println(err)
50 30
			os.Exit(1)
51 31
		}
52 32
53
		out, err := json.MarshalIndent(data, "  ", "  ")
33
		decoder := json.NewDecoder(res.Body)
34
		_, err = decoder.Token()
54 35
		if err != nil {
55 36
			fmt.Println(err)
56 37
			os.Exit(1)
57 38
		}
58 39
59
		os.Stdout.Write(out)
60
	}
40
		first := true
41
		for decoder.More() {
42
			if !first {
43
				os.Stdout.WriteString(", ")
44
			} else {
45
				first = false
46
			}
61 47
62
	_, err = decoder.Token()
63
	if err != nil {
64
		fmt.Println(err)
65
		os.Exit(1)
66
	}
48
			var data interface{}
49
			err := decoder.Decode(&data)
50
			if err != nil {
51
				fmt.Println("decode:", err)
52
				os.Exit(1)
53
			}
67 54
68
	os.Stdout.WriteString("\n]\n")
55
			out, err := json.MarshalIndent(data, "  ", "  ")
56
			if err != nil {
57
				fmt.Println(err)
58
				os.Exit(1)
59
			}
60
61
			os.Stdout.Write(out)
62
		}
63
64
		_, err = decoder.Token()
65
		if err != nil {
66
			fmt.Println(err)
67
			os.Exit(1)
68
		}
69 69
70
	next := ""
71
	links := res.Header.Get("Link")
72
	if links != "" {
73
		for _, link := range strings.Split(links, ",") {
74
			link := strings.TrimSpace(link)
75
			start := strings.Index(link, "<")
76
			end := strings.Index(link, ">")
77
			if start != -1 && end != -1 && start < end &&
78
				strings.HasSuffix(link, "rel=\"next\"") {
79
				next = link[start+1 : end]
80
				break
70
		url = ""
71
		links := res.Header.Get("Link")
72
		if links != "" {
73
			for _, link := range strings.Split(links, ",") {
74
				link := strings.TrimSpace(link)
75
				start := strings.Index(link, "<")
76
				end := strings.Index(link, ">")
77
				if start != -1 && end != -1 && start < end &&
78
					strings.HasSuffix(link, "rel=\"next\"") {
79
					url = link[start+1 : end]
80
					break
81
				}
81 82
			}
82 83
		}
83 84
	}
84 85
85
	if next != "" {
86
		fmt.Fprintf(os.Stderr, next)
87
	}
86
	os.Stdout.WriteString("\n]\n")
88 87
}