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 }