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

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