//go:build ignore package main import ( "bufio" "fmt" "log" "os" "regexp" "strings" "text/template" "time" ) const Directory = "/usr/share/dict" var wordsTemplate = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT. // This file was generated by robots at // {{ .Timestamp }} // using data from // {{ .Path }} package dictionary var {{ .VarName }} = []string{ {{- range .Words }} {{ printf "%q" . }}, {{- end }} } `)) type templateData struct { Timestamp time.Time Path string Words []string VarName string } func generateFile(name string) { fmt.Println("generating file for dictionary " + name) lowerName := strings.ToLower(name) words := []string{} Path := Directory + "/" + lowerName file, err := os.Open(Path) if err != nil { die(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { w := strings.TrimSpace(scanner.Text()) if regexp.MustCompile(`^[a-zA-Z0-9]*$`).MatchString(w) { words = append(words, w) } } if err := scanner.Err(); err != nil { log.Fatal(err) } f, err := os.Create("internal/dictionary/" + lowerName + ".go") die(err) defer f.Close() wordsTemplate.Execute(f, templateData{ Timestamp: time.Now(), Path: Path, Words: words, VarName: strings.Title(name), }) } func main() { fmt.Println("Generate") entries, err := os.ReadDir(Directory) if err != nil { die(err) } for _, e := range entries { if !strings.Contains(e.Name(), ".") { generateFile(e.Name()) } } // generateFile("words") } func die(err error) { if err != nil { log.Fatal(err) } }