Add command to generate a new listener for an event

This commit is contained in:
kolaente 2021-02-01 18:37:34 +01:00
parent 5dac13c6c8
commit 3f21b3610e
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
2 changed files with 94 additions and 12 deletions

1
go.mod
View File

@ -86,6 +86,7 @@ require (
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf
golang.org/x/text v0.3.5 // indirect
google.golang.org/protobuf v1.25.0
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/d4l3k/messagediff.v1 v1.2.1

View File

@ -61,13 +61,15 @@ var (
// Aliases are mage aliases of targets
Aliases = map[string]interface{}{
"build": Build.Build,
"do-the-swag": DoTheSwag,
"check:got-swag": Check.GotSwag,
"release:os-package": Release.OsPackage,
"dev:create-migration": Dev.CreateMigration,
"generate-docs": GenerateDocs,
"check:golangci-fix": Check.GolangciFix,
"build": Build.Build,
"do-the-swag": DoTheSwag,
"check:got-swag": Check.GotSwag,
"release:os-package": Release.OsPackage,
"dev:make-migration": Dev.MakeMigration,
"dev:make-event": Dev.MakeEvent,
"dev:make-listener": Dev.MakeListener,
"generate-docs": GenerateDocs,
"check:golangci-fix": Check.GolangciFix,
}
)
@ -295,6 +297,18 @@ func moveFile(src, dst string) error {
return nil
}
func appendToFile(filename, content string) error {
f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
return err
}
defer f.Close()
_, err = f.WriteString(content)
return err
}
const InfoColor = "\033[1;32m%s\033[0m"
func printSuccess(text string, args ...interface{}) {
@ -703,7 +717,7 @@ func (Release) Packages() error {
type Dev mg.Namespace
// Creates a new bare db migration skeleton in pkg/migration with the current date
func (Dev) CreateMigration() error {
func (Dev) MakeMigration() error {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter the name of the struct: ")
@ -772,7 +786,7 @@ func init() {
}
// Create a new event. Takes the name of the event as the first argument and the module where the event should be created as the second argument. Events will be appended to the pkg/<module>/events.go file.
func (Dev) CreateEvent(name, module string) error {
func (Dev) MakeEvent(name, module string) error {
name = strcase.ToCamel(name)
@ -791,18 +805,85 @@ func (t *` + name + `) TopicName() string {
}
`
filename := "./pkg/" + module + "/events.go"
f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err := appendToFile(filename, newEventCode); err != nil {
return err
}
printSuccess("The new event has been created successfully! Head over to %s and adjust its content.", filename)
return nil
}
func (Dev) MakeListener(name, event, module string) error {
name = strcase.ToCamel(name)
listenerName := strcase.ToDelimited(name, '.')
listenerCode := `
type ` + name + ` struct {
}
func (s *` + name + `) Name() string {
return "` + listenerName + `"
}
func (s *` + name + `) Handle(payload message.Payload) (err error) {
event := &` + event + `{}
err = json.Unmarshal(payload, event)
if err != nil {
return err
}
return nil
}
`
filename := "./pkg/" + module + "/listeners.go"
//////
// Register the listener
file, err := os.Open(filename)
if err != nil {
return err
}
scanner := bufio.NewScanner(file)
var idx int64 = 0
for scanner.Scan() {
if scanner.Text() == "}" {
//idx -= int64(len(scanner.Text()))
break
}
idx += int64(len(scanner.Bytes()) + 1)
}
file.Close()
registerListenerCode := ` events.RegisterListener((&` + event + `{}).TopicName(), &` + name + `{})
`
f, err := os.OpenFile(filename, os.O_RDWR, 0600)
if err != nil {
return err
}
defer f.Close()
if _, err = f.WriteString(newEventCode); err != nil {
if _, err := f.Seek(idx, 0); err != nil {
return err
}
remainder, err := ioutil.ReadAll(f)
if err != nil {
return err
}
f.Seek(idx, 0)
f.Write([]byte(registerListenerCode))
f.Write(remainder)
///////
// Append the listener code
if err := appendToFile(filename, listenerCode); err != nil {
return err
}
printSuccess("The new event has been created successfully! Head over to %s and adjust its content.", filename)
printSuccess("The new listener has been created successfully! Head over to %s and adjust its content.", filename)
return nil
}