github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/funcs/image_encode.go (about) 1 package funcs 2 3 import ( 4 "context" 5 "image/png" 6 "strings" 7 8 "github.com/nevalang/neva/internal/runtime" 9 ) 10 11 type imageEncode struct{} 12 13 func (imageEncode) Create(io runtime.FuncIO, _ runtime.Msg) (func(ctx context.Context), error) { 14 in, err := io.In.Port("img") 15 if err != nil { 16 return nil, err 17 } 18 19 data, err := io.Out.Port("data") 20 if err != nil { 21 return nil, err 22 } 23 24 errCh, err := io.Out.Port("err") 25 if err != nil { 26 return nil, err 27 } 28 29 return func(ctx context.Context) { 30 for { 31 var b imageMsg 32 select { 33 case m := <-in: 34 b.decode(m) 35 case <-ctx.Done(): 36 return 37 } 38 im := b.createImage() 39 // Encode the image in the desired format to sb. 40 var sb strings.Builder // for encoded output. 41 if err := png.Encode(&sb, im); err != nil { 42 // Something went wrong. Send err. 43 select { 44 case errCh <- runtime.NewMapMsg(map[string]runtime.Msg{ 45 "error": runtime.NewStrMsg(err.Error()), 46 }): 47 continue 48 case <-ctx.Done(): 49 return 50 } 51 } 52 // Send the image. 53 select { 54 case data <- runtime.NewStrMsg(sb.String()): 55 case <-ctx.Done(): 56 return 57 } 58 } 59 }, nil 60 }