Пример #1
0
func (m Modify) Exec(s string) (interface{}, error) {
	l := lexer.NewLexer([]byte(s))
	var res interface{}
	res = nil

	for tok := l.Scan(); (tok.Type == token.TokMap.Type("var")) ||
		(tok.Type == token.TokMap.Type("func")); tok = l.Scan() {
		switch {
		case tok.Type == token.TokMap.Type("var"):
			//fmt.Printf("var token: %v\n", string(tok.Lit))
			if val, err := m.resolve(string(tok.Lit)); err != nil {
				return nil, err
			} else {
				res = m.convert(val)
			}
		case tok.Type == token.TokMap.Type("func"):
			//fmt.Printf("func token: %v\n", string(tok.Lit))
			if funcName, funcArgs, err := m.parseFunc(tok.Lit); err == nil {
				funcArgs[0] = res
				if fv, err := m.Call(funcName, funcArgs...); err != nil {
					return nil, fmt.Errorf("execution error %s: %v", funcName, err)
				} else {
					res = m.convert(fv.String())
				}
			} else {
				return nil, fmt.Errorf("error parse %s: %v", tok.Lit, err)
			}
		default:
			return nil, fmt.Errorf("unknown token %v\n", string(tok.Lit))
		}
	}
	return res, nil
}
Пример #2
0
func (m Modify) parseFunc(s []byte) (string, []interface{}, error) {
	f := m.clearFunc(s)
	funcName := f[0]
	funcArgs := []interface{}{nil}
	if len(f) == 1 {
		return funcName, funcArgs, nil
	}
	fl := lexer.NewLexer([]byte(f[1]))
	for ftok := fl.Scan(); ftok.Type == token.TokMap.Type("arg"); ftok = fl.Scan() {
		funcArgs = append(funcArgs, m.convert(m.clearArg(ftok.Lit)))
	}
	return funcName, funcArgs, nil
}