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 }