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  }