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  }