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

     1  package funcs
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"os"
     7  
     8  	"github.com/nevalang/neva/internal/runtime"
     9  )
    10  
    11  type readAll struct{}
    12  
    13  func (c readAll) Create(rio runtime.FuncIO, msg runtime.Msg) (func(ctx context.Context), error) {
    14  	filename, err := rio.In.Port("filename")
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  
    19  	dataPort, err := rio.Out.Port("data")
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  
    24  	errPort, err := rio.Out.Port("err")
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  
    29  	return func(ctx context.Context) {
    30  		for {
    31  			var name runtime.Msg
    32  			select {
    33  			case <-ctx.Done():
    34  				return
    35  			case name = <-filename:
    36  			}
    37  
    38  			f, err := os.Open(name.Str())
    39  			if err != nil {
    40  				select {
    41  				case <-ctx.Done():
    42  					return
    43  				case errPort <- errorFromString(err.Error()):
    44  					continue
    45  				}
    46  			}
    47  
    48  			data, err := io.ReadAll(f)
    49  			if err != nil {
    50  				select {
    51  				case <-ctx.Done():
    52  					return
    53  				case errPort <- errorFromString(err.Error()):
    54  					continue
    55  				}
    56  			}
    57  
    58  			if err := f.Close(); err != nil {
    59  				select {
    60  				case <-ctx.Done():
    61  					return
    62  				case errPort <- errorFromString(err.Error()):
    63  					continue
    64  				}
    65  			}
    66  
    67  			select {
    68  			case <-ctx.Done():
    69  				return
    70  			case dataPort <- runtime.NewStrMsg(string(data)):
    71  			}
    72  		}
    73  	}, nil
    74  }