53 lines
946 B
Go
53 lines
946 B
Go
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
|
|
}
|