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 }
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 }