cmd/generate/main.go (72 lines of code) (raw):
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"os/exec"
"regexp"
"time"
)
var versionRegexp = regexp.MustCompile(`^v\d+\.\d+\.\d+`)
const (
timeout = 30 * time.Second
genFile = "generated_mime_types.go"
versionFile = "VERSION"
)
type MimeType struct {
Source string `json:"source"`
Extensions []string `json:"extensions"`
Compressible bool `json:"compressible"`
Charset string `json:"charset"`
}
type Data map[string]MimeType
func main() {
os.Remove(genFile)
out, err := os.OpenFile(genFile, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
panic(err)
}
defer out.Close()
f, err := os.Open(versionFile)
if err != nil {
panic(err)
}
defer f.Close()
v, err := io.ReadAll(f)
if err != nil {
panic(err)
}
client := http.Client{
Timeout: timeout,
}
rsp, err := client.Get(fmt.Sprintf("https://cdn.rawgit.com/jshttp/mime-db/%s/db.json", versionRegexp.FindString(string(v))))
if err != nil {
panic(err)
}
if rsp.StatusCode != http.StatusOK {
panic(rsp)
}
var result Data
if err := json.NewDecoder(rsp.Body).Decode(&result); err != nil {
panic(err)
}
fmt.Fprintln(out, "package mimedb")
fmt.Fprintln(out, "")
fmt.Fprintln(out, "var (")
fmt.Fprintln(out, " MimeTypeToExts = map[string][]string{")
for mimeType, entry := range result {
if len(entry.Extensions) > 0 {
fmt.Fprintf(out, " %q: %#v,\n", mimeType, entry.Extensions)
}
}
fmt.Fprintln(out, " }")
fmt.Fprintln(out, ")")
if err := out.Close(); err != nil {
panic(err)
}
// run `go fmt` on the output
if err := exec.Command("go", "fmt").Run(); err != nil {
panic(err)
}
}