diff --git a/go.mod b/go.mod index a435090e4..97ccdf896 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/magefile.go b/magefile.go index 83590f43c..7e009e91a 100644 --- a/magefile.go +++ b/magefile.go @@ -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//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 }