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

     1  package ranges
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  )
     7  
     8  type rfIndex struct {
     9  	start int
    10  	end   int
    11  	i     int
    12  }
    13  
    14  func (rf *rfIndex) Start(_ []byte) bool {
    15  	rf.i++
    16  	return rf.i > rf.start
    17  }
    18  
    19  func (rf *rfIndex) End(_ []byte) bool {
    20  	if rf.end > -1 {
    21  		rf.i++
    22  		return rf.i > rf.end
    23  	}
    24  	return false
    25  }
    26  
    27  func (rf *rfIndex) SetLength(i int) {
    28  	rf.start += i + 1
    29  	rf.end += i + 1
    30  }
    31  
    32  func createRfIndex(r *rangeParameters) (*rfIndex, error) {
    33  	rf := new(rfIndex)
    34  
    35  	sStart := r.Start
    36  	sEnd := r.End
    37  
    38  	if sStart == "" {
    39  		sStart = "0"
    40  	}
    41  
    42  	if sEnd == "" {
    43  		sEnd = "-1"
    44  	}
    45  
    46  	var err error
    47  
    48  	rf.start, err = strconv.Atoi(sStart)
    49  	if err != nil {
    50  		return nil, fmt.Errorf("cannot convert start value to integer: %s", err.Error())
    51  	}
    52  
    53  	rf.end, err = strconv.Atoi(sEnd)
    54  	if err != nil {
    55  		return nil, fmt.Errorf("cannot convert end value to integer: %s", err.Error())
    56  	}
    57  
    58  	if rf.start < 0 {
    59  		r.Buffer = true
    60  		if r.End == "" {
    61  			rf.end = 1
    62  		}
    63  	}
    64  
    65  	if rf.start > 0 && !r.Exclude {
    66  		rf.end++
    67  	}
    68  
    69  	return rf, nil
    70  }
    71  
    72  func newIndex(r *rangeParameters) error {
    73  	rf, err := createRfIndex(r)
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	rf.start--
    79  	rf.end--
    80  
    81  	r.Match = rf
    82  
    83  	return nil
    84  }