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 }