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  }