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 }