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

     1  package index
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/lmorg/murex/builtins/core/ranges"
     9  	"github.com/lmorg/murex/config"
    10  	"github.com/lmorg/murex/debug"
    11  	"github.com/lmorg/murex/lang"
    12  	"github.com/lmorg/murex/lang/types"
    13  )
    14  
    15  func init() {
    16  	lang.DefineMethod("[", index, types.ReadIndex, types.Any)
    17  	lang.DefineMethod("![", index, types.ReadNotIndex, types.Any)
    18  
    19  	config.InitConf.Define("index", "silent", config.Properties{
    20  		Description: "Don't report error if an index in [ ] does not exist",
    21  		Default:     false,
    22  		DataType:    types.Boolean,
    23  	})
    24  }
    25  
    26  func index(p *lang.Process) (err error) {
    27  	if ranges.RxSplitRange.MatchString(p.Parameters.StringAll()) {
    28  		return ranges.CmdRange(p)
    29  	}
    30  
    31  	if !debug.Enabled {
    32  		defer func() {
    33  			if r := recover(); r != nil {
    34  				err = fmt.Errorf("panic caught, please report this to https://github.com/lmorg/murex/issues : %s", r)
    35  			}
    36  		}()
    37  	}
    38  
    39  	dt := p.Stdin.GetDataType()
    40  	// We will set data type from the index function but fallback to this just
    41  	// in case it's forgotten about in the index function. This is safe because
    42  	// SetDataType() cannot overwrite the data type once set.
    43  	defer p.Stdout.SetDataType(dt)
    44  
    45  	if err := p.ErrIfNotAMethod(); err != nil {
    46  		return err
    47  	}
    48  
    49  	params := p.Parameters.StringArray()
    50  	l := len(params) - 1
    51  	if l < 0 {
    52  		return errors.New("missing parameters. Please select 1 or more indexes")
    53  	}
    54  	switch {
    55  	case params[l] == "]":
    56  		params = params[:l]
    57  	case strings.HasSuffix(params[l], "]"):
    58  		params[l] = params[l][:len(params[l])-1]
    59  	default:
    60  		return errors.New("missing closing bracket, ` ]`")
    61  	}
    62  
    63  	var f func(p *lang.Process, params []string) error
    64  	if p.IsNot {
    65  		f = lang.ReadNotIndexes[dt]
    66  		if f == nil {
    67  			return errors.New("i don't know how to get an !index from this data type: `" + dt + "`")
    68  		}
    69  	} else {
    70  		f = lang.ReadIndexes[dt]
    71  		if f == nil {
    72  			return errors.New("i don't know how to get an index from this data type: `" + dt + "`")
    73  		}
    74  	}
    75  
    76  	silent, err := p.Config.Get("index", "silent", types.Boolean)
    77  	if err != nil {
    78  		silent = false
    79  	}
    80  
    81  	err = f(p, params)
    82  	if silent.(bool) {
    83  		return nil
    84  	}
    85  
    86  	return err
    87  }