1
0
mirror of https://github.com/fumiama/NanoBot.git synced 2026-06-06 03:00:24 +08:00
Files
NanoBot/codegen/engine/main.go
2023-10-18 13:45:11 +09:00

115 lines
2.6 KiB
Go

package main
import (
"os"
"strings"
"gopkg.in/yaml.v3"
)
const head = `// Code generated by codegen/engine. DO NOT EDIT.
package nano
`
const emptyon = `
// On[Message] ...
func (e *Engine) On[Message](rules ...Rule) *Matcher { return e.On("[Message]", rules...) }
// On[Message] ...
func On[Message](rules ...Rule) *Matcher { return On("[Message]", rules...) }
`
const ruleon = `
// On[Message][Rule] ...
func On[Message][Rule]([Name] [Type], rules ...Rule) *Matcher {
return defaultEngine.On[Message][Rule]([Name], rules...)
}
// On[Message][Rule] ...
func (e *Engine) On[Message][Rule]([Name] [Type], rules ...Rule) *Matcher {
matcher := &Matcher{
Type: "[Message]",
Rules: append([]Rule{[Rule]Rule([Name][...])}, rules...),
Engine: e,
}
e.matchers = append(e.matchers, matcher)
return StoreMatcher(matcher)
}
`
const ruleonshell = `
// On[Message]Shell shell命令触发器
func On[Message]Shell(command string, model interface{}, rules ...Rule) *Matcher {
return defaultEngine.On[Message]Shell(command, model, rules...)
}
// On[Message]Shell shell命令触发器
func (e *Engine) On[Message]Shell(command string, model interface{}, rules ...Rule) *Matcher {
matcher := &Matcher{
Type: "[Message]",
Rules: append([]Rule{ShellRule(command, model)}, rules...),
Engine: e,
}
e.matchers = append(e.matchers, matcher)
return StoreMatcher(matcher)
}
`
type config struct {
EmptyOn []string `yaml:"emptyon"`
RuleOn struct {
Message []string `yaml:"Message"`
Rule [][3]string `yaml:"Rule"`
} `yaml:"ruleon"`
}
func main() {
f, err := os.Create("engine_generated.go")
if err != nil {
panic(err)
}
defer f.Close()
_, err = f.WriteString(head)
if err != nil {
panic(err)
}
ef, err := os.Open("codegen/engine/engine.yml")
if err != nil {
panic(err)
}
defer ef.Close()
cfg := config{}
err = yaml.NewDecoder(ef).Decode(&cfg)
if err != nil {
panic(err)
}
for _, msg := range cfg.EmptyOn {
_, err = f.WriteString(strings.ReplaceAll(emptyon, "[Message]", msg))
if err != nil {
panic(err)
}
}
for _, msg := range cfg.RuleOn.Message {
for _, x := range cfg.RuleOn.Rule {
s := strings.ReplaceAll(ruleon, "[Message]", msg)
s = strings.ReplaceAll(s, "[Rule]", x[0])
s = strings.ReplaceAll(s, "[Name]", x[1])
s = strings.ReplaceAll(s, "[Type]", x[2])
if strings.Contains(x[0], "Group") {
s = strings.ReplaceAll(s, "[...]", "...")
} else {
s = strings.ReplaceAll(s, "[...]", "")
}
_, err = f.WriteString(s)
if err != nil {
panic(err)
}
}
_, err = f.WriteString(strings.ReplaceAll(ruleonshell, "[Message]", msg))
if err != nil {
panic(err)
}
}
}