102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
|
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:]
|
||
|
}
|