github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/int_parse.go (about)

     1  package funcs
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"github.com/nevalang/neva/internal/runtime"
    10  )
    11  
    12  type parseInt struct{}
    13  
    14  func (p parseInt) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) {
    15  	dataIn, err := io.In.Port("data")
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  
    20  	resOut, err := io.Out.Port("res")
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	errOut, err := io.Out.Port("err")
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  
    30  	return func(ctx context.Context) {
    31  		var str runtime.Msg
    32  
    33  		for {
    34  			select {
    35  			case <-ctx.Done():
    36  				return
    37  			case str = <-dataIn:
    38  			}
    39  
    40  			parsedNum, err := parse(str.Str())
    41  			if err != nil {
    42  				select {
    43  				case <-ctx.Done():
    44  					return
    45  				case errOut <- runtime.NewStrMsg(err.Error()):
    46  				}
    47  				continue
    48  			}
    49  
    50  			select {
    51  			case <-ctx.Done():
    52  				return
    53  			case resOut <- parsedNum:
    54  			}
    55  		}
    56  	}, nil
    57  }
    58  
    59  func parse(str string) (runtime.Msg, error) {
    60  	v, err := strconv.Atoi(str)
    61  	if err != nil {
    62  		return nil, errors.New(strings.TrimPrefix(err.Error(), "strconv.Atoi: "))
    63  	}
    64  	return runtime.NewIntMsg(int64(v)), nil
    65  }