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  }