github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/scanln.go (about) 1 package funcs 2 3 import ( 4 "bufio" 5 "context" 6 "os" 7 8 "github.com/nevalang/neva/internal/runtime" 9 ) 10 11 type scanln struct{} 12 13 func (r scanln) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) { 14 sigIn, err := io.In.Port("sig") 15 if err != nil { 16 return nil, err 17 } 18 19 dataOut, err := io.Out.Port("data") 20 if err != nil { 21 return nil, err 22 } 23 24 return func(ctx context.Context) { 25 var reader = bufio.NewReader(os.Stdin) 26 27 for { 28 select { 29 case <-ctx.Done(): 30 return 31 case <-sigIn: 32 } 33 34 bb, _, err := reader.ReadLine() 35 if err != nil { 36 panic(err) 37 } 38 39 select { 40 case <-ctx.Done(): 41 return 42 case dataOut <- runtime.NewStrMsg(string(bb)): 43 } 44 } 45 }, nil 46 }