//go:build ignore // +build ignore package main import ( "encoding/json" "log" "net/http" "os" "strings" "text/template" "time" ) // This program generates license_list.go. const ( source = "license_list.go" url = "https://spdx.org/licenses/licenses.json" ) var tmp = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT. // This file was generated by robots at {{ .Timestamp }} // using data from {{ .URL }} package spdxlicense const Version = {{ printf "%q" .Version }} var licenseIDs = map[string]string{ {{- range $k, $v := .LicenseIDs }} {{ printf "%q" $k }}: {{ printf "%q" $v }}, {{- end }} } `)) type LicenseList struct { Version string `json:"licenseListVersion"` Licenses []struct { ID string `json:"licenseId"` Name string `json:"name"` Text string `json:"licenseText"` Deprecated bool `json:"isDeprecatedLicenseId"` OSIApproved bool `json:"isOsiApproved"` SeeAlso []string `json:"seeAlso"` } `json:"licenses"` } func main() { resp, err := http.Get(url) if err != nil { log.Fatalf("unable to get licenses list: %+v", err) } var result LicenseList if err = json.NewDecoder(resp.Body).Decode(&result); err != nil { log.Fatalf("unable to decode license list: %+v", err) } f, err := os.Create(source) if err != nil { log.Fatalf("unable to create %q: %+v", source, err) } defer func() { if err := f.Close(); err != nil { log.Fatalf("unable to close %q: %+v", source, err) } }() var licenseIDs = make(map[string]string) for _, l := range result.Licenses { cleanID := strings.ToLower(l.ID) if _, exists := licenseIDs[cleanID]; exists { log.Fatalf("duplicate license ID found: %q", cleanID) } licenseIDs[cleanID] = l.ID } err = tmp.Execute(f, struct { Timestamp time.Time URL string Version string LicenseIDs map[string]string }{ Timestamp: time.Now(), URL: url, Version: result.Version, LicenseIDs: licenseIDs, }) if err != nil { log.Fatalf("unable to generate template: %+v", err) } }