github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/plugins/events.go (about) 1 package plugins 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 "os/exec" 8 "strings" 9 "sync" 10 11 "github.com/gobuffalo/envy" 12 "github.com/gobuffalo/events" 13 ) 14 15 const ( 16 EvtSetupStarted = "buffalo-plugins:setup:started" 17 EvtSetupErr = "buffalo-plugins:setup:err" 18 EvtSetupFinished = "buffalo-plugins:setup:finished" 19 ) 20 21 var loadPluginsOnce sync.Once 22 23 // Load will add listeners for any plugins that support "events" 24 func Load() error { 25 var errResult error 26 loadPluginsOnce.Do(func() { 27 // don't send plugins events during testing 28 if envy.Get("GO_ENV", "development") == "test" { 29 return 30 } 31 32 plugs, err := Available() 33 if err != nil { 34 errResult = err 35 return 36 } 37 38 for _, cmds := range plugs { 39 for _, c := range cmds { 40 if c.BuffaloCommand != "events" { 41 continue 42 } 43 44 err := func(c Command) error { 45 n := fmt.Sprintf("[PLUGIN] %s %s", c.Binary, c.Name) 46 fn := func(e events.Event) { 47 b, err := json.Marshal(e) 48 if err != nil { 49 fmt.Println("error trying to marshal event", e, err) 50 return 51 } 52 cmd := exec.Command(c.Binary, c.UseCommand, string(b)) 53 cmd.Stderr = os.Stderr 54 cmd.Stdout = os.Stdout 55 cmd.Stdin = os.Stdin 56 if err := cmd.Run(); err != nil { 57 fmt.Println("error trying to send event", strings.Join(cmd.Args, " "), err) 58 } 59 } 60 events.NamedListen(n, events.Filter(c.ListenFor, fn)) 61 return nil 62 }(c) 63 if err != nil { 64 errResult = err 65 return 66 } 67 } 68 } 69 }) 70 return errResult 71 }