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 }