-
Notifications
You must be signed in to change notification settings - Fork 1
/
ExpressionEngineJee.go
126 lines (116 loc) · 3.25 KB
/
ExpressionEngineJee.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package engines
import (
"github.com/zhuxiujia/GoMybatis/lib/github.com/nytlabs/gojee"
"github.com/zhuxiujia/GoMybatis/utils"
"bytes"
"encoding/json"
"strings"
)
type ExpressionOperation = int
const (
JeeOperation_Marshal_Map ExpressionOperation = iota //序列化和反序列化为json
JeeOperation_Unmarshal_Byte
)
//ExpressionEngineJee 是一个基于json表达式操作的第三方库实现
type ExpressionEngineJee struct {
}
func (it *ExpressionEngineJee) Name() string {
return "ExpressionEngineJee"
}
//编译一个表达式
//参数:lexerArg 表达式内容
//返回:interface{} 编译结果,error 错误
func (it *ExpressionEngineJee) Lexer(lexerArg string) (interface{}, error) {
tokenized, err := jee.Lexer(it.LexerAndOrSupport(lexerArg))
if err != nil {
return nil, utils.NewError("ExpressionEngineJee", err)
}
tree, err := jee.Parser(tokenized)
if err != nil {
return nil, utils.NewError("ExpressionEngineJee", err)
}
return tree, nil
}
//执行一个表达式
//参数:lexerResult=编译结果,arg=参数
//返回:执行结果,错误
func (it *ExpressionEngineJee) Eval(compileResult interface{}, arg interface{}, operation int) (interface{}, error) {
var jeeMsg jee.BMsg
switch operation {
case JeeOperation_Marshal_Map:
//to json,针对arg是map[string]interface{}的数据类型
bytes, err := json.Marshal(arg.(map[string]interface{}))
if err != nil {
return nil, utils.NewError("ExpressionEngineJee", err)
}
err = json.Unmarshal(bytes, &jeeMsg)
if err != nil {
return nil, utils.NewError("ExpressionEngineJee", err)
}
break
case JeeOperation_Unmarshal_Byte:
//to json,针对arg是json byte的数据类型
err := json.Unmarshal(arg.([]byte), &jeeMsg)
if err != nil {
return nil, utils.NewError("ExpressionEngineJee", err)
}
break
default:
return nil, utils.NewError("ExpressionEngineJee", "unknow operation value = ", operation, "!")
}
result, err := jee.Eval(compileResult.(*jee.TokenTree), jeeMsg)
if err != nil {
return nil, utils.NewError("ExpressionEngineJee", err)
}
return result, nil
}
func (it *ExpressionEngineJee) LexerAndEval(lexerArg string, arg interface{}) (interface{}, error) {
var lex, err = it.Lexer(lexerArg)
if err != nil {
return nil, err
}
return it.Eval(lex, arg, 0)
}
//编译后立即执行
func (it *ExpressionEngineJee) LexerEval(lexerArg string, arg interface{}, operation int) (interface{}, error) {
var lexer, error = it.Lexer(lexerArg)
if error != nil {
return nil, error
}
return it.Eval(lexer, arg, operation)
}
//添加and 和 or 语法支持
func (it *ExpressionEngineJee) LexerAndOrSupport(lexerArg string) string {
var buf bytes.Buffer
strs := strings.Split(lexerArg, " or ")
if len(strs) > 1 {
buf.Reset()
var buf bytes.Buffer
var len = len(strs)
for index, k := range strs {
buf.WriteString("(")
buf.WriteString(k)
buf.WriteString(")")
if index+1 < len {
buf.WriteString(" || ")
}
}
lexerArg = buf.String()
buf.Reset()
}
strs = strings.Split(lexerArg, " and ")
if len(strs) > 1 {
var len = len(strs)
for index, k := range strs {
buf.WriteString("(")
buf.WriteString(k)
buf.WriteString(")")
if index+1 < len {
buf.WriteString(" && ")
}
}
lexerArg = buf.String()
buf.Reset()
}
return lexerArg
}