Simon Bruder
658690b152
The evaluator is the main part of this, so it doesn’t have to be in a subdirectory.
52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"io/ioutil"
|
||
"os"
|
||
"sort"
|
||
|
||
"gopkg.in/yaml.v2"
|
||
)
|
||
|
||
func loadBangs() (bangs map[string]string) {
|
||
data, err := ioutil.ReadFile("bangs.yml")
|
||
if err != nil {
|
||
panic(fmt.Sprintf("Failed to load bangs.yml: %v", err))
|
||
}
|
||
|
||
err = yaml.Unmarshal(data, &bangs)
|
||
if err != nil {
|
||
panic(fmt.Sprintf("Failed to decode bangs: %v", err))
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
func main() {
|
||
bangs := loadBangs()
|
||
|
||
// generating sorted keys to have stable generated code
|
||
// this is not optimal, performance-wise but it runs only once at build
|
||
// time, so it doesn’t matter that much)
|
||
bangNames := []string{}
|
||
for bang := range bangs {
|
||
bangNames = append(bangNames, bang)
|
||
}
|
||
sort.Strings(bangNames)
|
||
|
||
out, err := os.Create("bangs.go")
|
||
if err != nil {
|
||
panic(fmt.Sprintf("Failed to create bangs.go: %v", err))
|
||
}
|
||
|
||
out.Write([]byte("// Code generated from ../bangs.yml DO NOT EDIT.\n"))
|
||
out.Write([]byte("package main \n\nfunc getBang(name string) string {\n\tswitch name {\n"))
|
||
|
||
for _, bangName := range bangNames {
|
||
out.Write([]byte("\t\tcase `" + bangName + "`: return `" + bangs[bangName] + "`\n"))
|
||
}
|
||
out.Write([]byte("\t\tdefault: return \"\"\n"))
|
||
out.Write([]byte("\t}\n}\n"))
|
||
}
|