package main import ( "bytes" "go/format" "go/parser" "go/token" "io/ioutil" "log" "path/filepath" "sort" "strings" "text/template" ) var eventHandlerTmpl = template.Must(template.New("eventHandler").Funcs(template.FuncMap{ "constName": constName, "privateName": privateName, }).Parse(`// Code generated by "eventhandlers"; DO NOT EDIT // See events.go package gavalink // Following are all the event types. // Event type values are used to match the events returned by Lavalink. const ({{range .}} {{privateName .}}EventType = "{{constName .}}"{{end}} ) {{range .}} // {{privateName .}}EventHandler is an event handler for {{.}} events. type {{privateName .}}EventHandler func(*Player, *{{.}}) // Type returns the event type for {{.}} events. func (eh {{privateName .}}EventHandler) Type() string { return {{privateName .}}EventType } // New returns a new instance of {{.}}. func (eh {{privateName .}}EventHandler) New() interface{} { return &{{.}}{} } // Handle is the handler for {{.}} events. func (eh {{privateName .}}EventHandler) Handle(p *Player, i interface{}) { if t, ok := i.(*{{.}}); ok { eh(p, t) } } {{end}} func handlerForInterface(handler interface{}) EventHandler { switch v := handler.(type) { case func(*Player, interface{}): return interfaceEventHandler(v){{range .}} case func(*Player, *{{.}}): return {{privateName .}}EventHandler(v){{end}} } return nil } func init() { {{range .}} registerInterfaceProvider({{privateName .}}EventHandler(nil)){{end}} } `)) func main() { var buf bytes.Buffer dir := filepath.Dir(".") fs := token.NewFileSet() parsedFile, err := parser.ParseFile(fs, "events.go", nil, 0) if err != nil { log.Fatalf("warning: internal error: could not parse events.go: %s", err) return } names := []string{} for object := range parsedFile.Scope.Objects { names = append(names, object) } sort.Strings(names) eventHandlerTmpl.Execute(&buf, names) src, err := format.Source(buf.Bytes()) if err != nil { log.Println("warning: internal error: invalid Go generated:", err) src = buf.Bytes() } err = ioutil.WriteFile(filepath.Join(dir, strings.ToLower("eventhandlers.go")), src, 0644) if err != nil { log.Fatal(buf, "writing output: %s", err) } } func constName(name string) string { return name + "Event" } func privateName(name string) string { return strings.ToLower(string(name[0])) + name[1:] }