/
sandbox.go
71 lines (60 loc) · 1.44 KB
/
sandbox.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package yak
import (
"github.com/yaklang/yaklang/common/utils"
"github.com/yaklang/yaklang/common/yak/antlr4yak"
"github.com/yaklang/yaklang/common/yak/yaklang"
)
type Sandbox struct {
config *SandboxConfig
engine *antlr4yak.Engine
}
type SandboxConfig struct {
lib map[string]any
}
type SandboxOption func(*SandboxConfig)
func WithSandbox_ExternalLib(lib map[string]any) SandboxOption {
return func(config *SandboxConfig) {
if config.lib == nil {
config.lib = make(map[string]any)
}
for k, v := range lib {
config.lib[k] = v
}
}
}
func NewSandbox(opts ...SandboxOption) *Sandbox {
c := &SandboxConfig{}
for _, opt := range opts {
opt(c)
}
if c.lib == nil {
c.lib = make(map[string]any)
}
s := yaklang.NewSandbox(c.lib)
return &Sandbox{
config: c,
engine: s,
}
}
func (s *Sandbox) ExecuteAsExpression(code string, vars ...any) (ret any, err error) {
var merged = make(map[string]any)
for _, v := range vars {
for k, v := range utils.InterfaceToGeneralMap(v) {
merged[k] = v
}
}
return s.engine.ExecuteAsExpression(code, merged)
}
func (s *Sandbox) ExecuteAsBoolean(code string, vars ...any) (ret bool, err error) {
var merged = make(map[string]any)
for _, v := range vars {
for k, v := range utils.InterfaceToGeneralMap(v) {
merged[k] = v
}
}
return s.engine.ExecuteAsBooleanExpression(code, merged)
}
var SandboxExports = map[string]any{
"Create": NewSandbox,
"library": WithSandbox_ExternalLib,
}