// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main import ( "bytes" "flag" "go/format" "io/ioutil" "log" "net/http" "os" "os/exec" "strings" "text/template" ) const ( goRepoPath = 1 << iota packagePath ) var tmpl = template.Must(template.New("").Parse(`// Created by go generate; DO NOT EDIT // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package gosrc const ( goRepoPath = {{.goRepoPath}} packagePath = {{.packagePath}} ) var pathFlags = map[string]int{ {{range $k, $v := .pathFlags}}{{printf "%q" $k}}: {{$v}}, {{end}} } var validTLDs = map[string]bool{ {{range $v := .validTLDs}}{{printf "%q" $v}}: true, {{end}} } `)) var output = flag.String("output", "data.go", "file name to write") func main() { log.SetFlags(0) log.SetPrefix("gen: ") flag.Parse() if flag.NArg() != 0 { log.Fatal("usage: decgen [--output filename]") } // Build map of standard repository path flags. cmd := exec.Command("go", "list", "std", "cmd") p, err := cmd.Output() if err != nil { log.Fatal(err) } pathFlags := map[string]int{ "builtin": packagePath | goRepoPath, "C": packagePath, } for _, path := range strings.Fields(string(p)) { pathFlags[path] |= packagePath | goRepoPath for { i := strings.LastIndex(path, "/") if i < 0 { break } path = path[:i] pathFlags[path] |= goRepoPath } } // Get list of valid TLDs. resp, err := http.Get("https://data.iana.org/TLD/tlds-alpha-by-domain.txt") if err != nil { log.Fatal(err) } defer resp.Body.Close() p, err = ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } var validTLDs []string for _, line := range strings.Split(string(p), "\n") { line = strings.TrimSpace(line) if len(line) == 0 || line[0] == '#' { continue } validTLDs = append(validTLDs, "."+strings.ToLower(line)) } // Generate output. var buf bytes.Buffer err = tmpl.Execute(&buf, map[string]interface{}{ "output": *output, "goRepoPath": goRepoPath, "packagePath": packagePath, "pathFlags": pathFlags, "validTLDs": validTLDs, }) if err != nil { log.Fatal("template error:", err) } source, err := format.Source(buf.Bytes()) if err != nil { log.Fatal("source format error:", err) } fd, err := os.Create(*output) _, err = fd.Write(source) if err != nil { log.Fatal(err) } }