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

     1  package string
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"strconv"
     7  
     8  	"github.com/lmorg/murex/lang"
     9  	"github.com/lmorg/murex/lang/types"
    10  )
    11  
    12  func index(p *lang.Process, params []string) error {
    13  	lines := make(map[int]bool)
    14  	for i := range params {
    15  		num, err := strconv.Atoi(params[i])
    16  		if err != nil {
    17  			return fmt.Errorf("Parameter, `%s`, isn't an integer. %s", params[i], err)
    18  		}
    19  		lines[num] = true
    20  	}
    21  
    22  	var (
    23  		i   int
    24  		err error
    25  	)
    26  
    27  	scanner := bufio.NewScanner(p.Stdin)
    28  	for scanner.Scan() {
    29  		if lines[i] != p.IsNot {
    30  			_, err = p.Stdout.Writeln(scanner.Bytes())
    31  			if err != nil {
    32  				break
    33  			}
    34  		}
    35  		i++
    36  	}
    37  
    38  	if err != nil {
    39  		return err
    40  	}
    41  
    42  	err = scanner.Err()
    43  	if err != nil {
    44  		return fmt.Errorf("error while indexing a %s map: %s", types.String, err.Error())
    45  	}
    46  
    47  	return nil
    48  }