/
crates.go
65 lines (55 loc) · 1.46 KB
/
crates.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package adapter
import (
"fmt"
"github.com/dustin/go-humanize"
"github.com/tidwall/gjson"
"github.com/zcong1993/badge-service/utils"
)
var (
cratesUnknownInput = makeUnknownTopicInput("crates")
cratesTopics = []string{"version", "downloads", "dl"}
)
// CratesApi is crates api provider
func CratesApi(args ...string) BadgeInput {
if len(args) != 2 {
return ErrorInput
}
topic := args[0]
name := args[1]
if !utils.IsOneOf(cratesTopics, topic) {
return cratesUnknownInput
}
endpoint := fmt.Sprintf("https://crates.io/api/v1/crates/%s", name)
resp, err := utils.Get(endpoint)
if err != nil {
return ErrorInput
}
if gjson.Get(string(resp), "errors").String() != "" {
reason := gjson.Get(string(resp), "errors.0.detail").String()
return BadgeInput{
Subject: "crates",
Status: utils.StringOrDefault(reason, "unknown"),
Color: "grey",
}
}
input := ErrorInput
switch topic {
case "version":
v := gjson.Get(string(resp), "crate.max_version").String()
input.Subject = "version"
input.Status = utils.NormalizeVersion(v)
input.Color = utils.VersionColor(v)
case "downloads", "dl":
d := gjson.Get(string(resp), "crate.downloads").Float()
if topic == "dl" {
d = gjson.Get(string(resp), "crate.recent_downloads").Float()
}
input.Subject = "downloads"
input.Status = utils.StringOrDefault(humanize.SIWithDigits(d, 2, ""), "0")
if topic == "dl" {
input.Status += " latest version"
}
input.Color = "green"
}
return input
}