github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/events/cmdcall/cmdcall.go (about)

     1  package cmdcall
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/ActiveState/cli/internal/locale"
     7  	"github.com/ActiveState/cli/internal/logging"
     8  	"github.com/ActiveState/cli/internal/output"
     9  	"github.com/ActiveState/cli/internal/primer"
    10  	"github.com/ActiveState/cli/internal/scriptrun"
    11  	"github.com/ActiveState/cli/internal/subshell"
    12  	"github.com/ActiveState/cli/pkg/project"
    13  )
    14  
    15  type primeable interface {
    16  	primer.Auther
    17  	primer.Outputer
    18  	primer.Projecter
    19  	primer.Subsheller
    20  	primer.Configurer
    21  	primer.Analyticer
    22  	primer.SvcModeler
    23  }
    24  
    25  // CmdCall manages dependencies for the handling of events triggered by command
    26  // calls.
    27  type CmdCall struct {
    28  	out       output.Outputer
    29  	proj      *project.Project
    30  	subshell  subshell.SubShell
    31  	cmdList   string
    32  	p         primeable
    33  	scriptrun *scriptrun.ScriptRun
    34  }
    35  
    36  // New returns a prepared pointer to an instance of CmdCall.
    37  func New(p primeable, cmdList string) *CmdCall {
    38  	return &CmdCall{
    39  		out:       p.Output(),
    40  		proj:      p.Project(),
    41  		subshell:  p.Subshell(),
    42  		cmdList:   cmdList,
    43  		p:         p,
    44  		scriptrun: scriptrun.New(p.Auth(), p.Output(), p.Subshell(), p.Project(), p.Config(), p.Analytics(), p.SvcModel()),
    45  	}
    46  }
    47  
    48  // Run executes the event handling logic by running any relevant scripts.
    49  func (cc *CmdCall) Run(eventType project.EventType) error {
    50  	logging.Debug("cmdcall")
    51  
    52  	if cc.proj == nil {
    53  		return nil
    54  	}
    55  
    56  	var events []*project.Event
    57  	for _, event := range cc.proj.Events() {
    58  		if event.Name() != string(eventType) {
    59  			continue
    60  		}
    61  
    62  		scopes, err := event.Scope()
    63  		if err != nil {
    64  			return locale.WrapError(
    65  				err, "cmdcall_event_err_get_scope",
    66  				"Cannot obtain scopes for event '[NOTICE]{{.V0}}[/RESET]'",
    67  				event.Name(),
    68  			)
    69  		}
    70  
    71  		for _, scope := range scopes {
    72  			if scope == cc.cmdList {
    73  				events = append(events, event)
    74  			}
    75  		}
    76  
    77  	}
    78  
    79  	if len(events) == 0 {
    80  		return nil
    81  	}
    82  
    83  	for _, event := range events {
    84  		val, err := event.Value()
    85  		if err != nil {
    86  			return locale.WrapError(
    87  				err, "cmdcall_event_err_get_value",
    88  				"Cannot get triggered event value for event '[NOTICE]{{.V0}}[/RESET]'",
    89  				event.Name(),
    90  			)
    91  		}
    92  
    93  		ss := strings.Split(val, " ")
    94  		if len(ss) == 0 {
    95  			return locale.NewError(
    96  				"cmdcall_event_err_get_value",
    97  				"Triggered event value is empty for event '[NOTICE]{{.V0}}[/RESET]'",
    98  				event.Name(),
    99  			)
   100  		}
   101  
   102  		scriptName, scriptArgs := ss[0], ss[1:]
   103  		if err := cc.scriptrun.Run(cc.proj.ScriptByName(scriptName), scriptArgs); err != nil {
   104  			return locale.WrapError(
   105  				err, "cmdcall_event_err_script_run",
   106  				"Failure running defined script '[NOTICE]{{.V0}}[/RESET]' for event '[NOTICE]{{.V1}}[/RESET]'",
   107  				scriptName, event.Name(),
   108  			)
   109  		}
   110  	}
   111  
   112  	return nil
   113  }