github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/open/openagent.go (about)

     1  package open
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/lmorg/murex/lang"
     8  	"github.com/lmorg/murex/lang/types"
     9  )
    10  
    11  func init() {
    12  	lang.DefineFunction("openagent", shell, types.Generic)
    13  	lang.DefineFunction("!openagent", shell, types.Null)
    14  }
    15  
    16  const usage = "Please use `get` or `set` (or use the bang (!) to unset) followed by a murex data-type"
    17  
    18  func shell(p *lang.Process) error {
    19  	p.Stdout.SetDataType(types.Generic)
    20  
    21  	if p.IsNot {
    22  		dataType, err := p.Parameters.String(0)
    23  		if err != nil {
    24  			return err
    25  		}
    26  		return OpenAgents.Unset(dataType)
    27  	}
    28  
    29  	flag, err := p.Parameters.String(0)
    30  	if err != nil {
    31  		return errors.New(err.Error() + ". " + usage)
    32  	}
    33  
    34  	dataType, err := p.Parameters.String(1)
    35  	if err != nil {
    36  		return errors.New(err.Error() + ". " + usage)
    37  	}
    38  
    39  	switch flag {
    40  	case "get":
    41  		agent, err := OpenAgents.Get(dataType)
    42  		if err != nil {
    43  			return err
    44  		}
    45  		_, err = p.Stdout.Write([]byte(string(agent.Block)))
    46  		return err
    47  
    48  	case "set":
    49  		block, err := p.Parameters.Block(2)
    50  		if err != nil {
    51  			return err
    52  		}
    53  		OpenAgents.Set(dataType, block, p.FileRef)
    54  		return nil
    55  
    56  	default:
    57  		return fmt.Errorf("invalid option\n%s", usage)
    58  	}
    59  }