package loadash import ( "fmt" "github.com/dop251/goja" "github.com/sirupsen/logrus" ) type PipeMap struct { vm *goja.Runtime } func NewPipeMap(fn string) (*PipeMap, error) { var ( err error pm = &PipeMap{} prefix = "let result; let doc; let myFn;" ) pm.vm = goja.New() if _, err = pm.vm.RunString(prefix); err != nil { logrus.Debugf("NewPipeMap: run prepare=%s err=%v", prefix, err) return nil, err } fn = "myFn = " + fn + ";" if _, err = pm.vm.RunString(fn); err != nil { err = fmt.Errorf("PipeMap: vm run string=%s err=%v", fn, err) logrus.Error(err) return nil, err } return pm, nil } func (m *PipeMap) Pipe(data any) (any, error) { var ( err error ) if err = m.vm.Set("doc", map[string]any{"data": data}); err != nil { return nil, err } if _, err = m.vm.RunString(`result = myFn(doc.data)`); err != nil { return nil, err } value := m.vm.Get("result").Export() return value, nil }