69 lines
1.2 KiB
Go
Raw Permalink Normal View History

2024-04-01 18:13:10 +08:00
package loadash
2024-04-02 18:12:02 +08:00
import (
2024-04-03 16:46:25 +08:00
"errors"
2024-04-02 18:12:02 +08:00
"fmt"
"github.com/dop251/goja"
2024-04-03 16:46:25 +08:00
"github.com/loveuer/nfflow/internal/interfaces"
"github.com/loveuer/nfflow/internal/sqlType"
2024-04-02 18:12:02 +08:00
"github.com/sirupsen/logrus"
)
type PipeMap struct {
vm *goja.Runtime
2024-04-03 16:46:25 +08:00
FN string `json:"fn"`
2024-04-02 18:12:02 +08:00
}
2024-04-03 16:46:25 +08:00
func NewPipeMap(cfg sqlType.JSONB) (interfaces.Pipe, error) {
2024-04-02 18:12:02 +08:00
var (
err error
pm = &PipeMap{}
prefix = "let result; let doc; let myFn;"
)
2024-04-03 16:46:25 +08:00
if err = cfg.Bind(pm); err != nil {
return nil, err
}
if pm.FN == "" {
return nil, errors.New("nil cfg")
}
2024-04-02 18:12:02 +08:00
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
}
2024-04-03 16:46:25 +08:00
fn := "myFn = " + pm.FN + ";"
2024-04-02 18:12:02 +08:00
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
}
2024-04-03 16:46:25 +08:00
func (m *PipeMap) Start(data any) (any, error) {
2024-04-02 18:12:02 +08:00
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
}
2024-04-03 16:46:25 +08:00
func (m *PipeMap) Close() {
m.vm = nil
}