github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/events/cmd.go (about) 1 package events 2 3 import ( 4 "fmt" 5 "regexp" 6 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/types" 9 "github.com/lmorg/murex/utils/ansi" 10 ) 11 12 func init() { 13 lang.DefineFunction("event", cmdEvent, types.Null) 14 lang.DefineFunction("!event", cmdUnevent, types.Null) 15 } 16 17 var rxNameInterruptSyntax = regexp.MustCompile(`^([-_a-zA-Z0-9]+)=(.*)$`) 18 19 func cmdEvent(p *lang.Process) error { 20 p.Stdout.SetDataType(types.Null) 21 22 et, err := p.Parameters.String(0) 23 if err != nil { 24 return err 25 } 26 27 if events[et] == nil { 28 return fmt.Errorf("no event-type known for `%s`.\nRun `runtime --events` to view which events are compiled in", et) 29 } 30 31 nameInterrupt, err := p.Parameters.String(1) 32 if err != nil { 33 return err 34 } 35 36 split := rxNameInterruptSyntax.FindAllStringSubmatch(nameInterrupt, 1) 37 if len(split) != 1 || len(split[0]) != 3 { 38 return fmt.Errorf("invalid syntax: `%s`. Expected: `name=interrupt`", nameInterrupt) 39 } 40 41 name := split[0][1] 42 interrupt := ansi.ExpandConsts(split[0][2]) 43 44 block, err := p.Parameters.Block(2) 45 if err != nil { 46 return err 47 } 48 49 err = events[et].Add(name, interrupt, block, p.FileRef) 50 return err 51 } 52 53 func cmdUnevent(p *lang.Process) error { 54 p.Stdout.SetDataType(types.Null) 55 56 et, err := p.Parameters.String(0) 57 if err != nil { 58 return err 59 } 60 61 if events[et] == nil { 62 return fmt.Errorf("no event-type known for `%s`.\nRun `runtime --events` to view which events are compiled in", et) 63 } 64 65 name, err := p.Parameters.String(1) 66 if err != nil { 67 return err 68 } 69 70 err = events[et].Remove(name) 71 return err 72 }