natspec.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package natspec
  2. import (
  3. "fmt"
  4. "github.com/obscuren/otto"
  5. )
  6. type NatSpec struct {
  7. jsvm *otto.Otto
  8. }
  9. // TODO: should initialise with abi and userdoc jsons
  10. func New() (self *NatSpec, err error) {
  11. self = new(NatSpec)
  12. self.jsvm = otto.New()
  13. _, err = self.jsvm.Run(natspecJS)
  14. if err != nil {
  15. return
  16. }
  17. _, err = self.jsvm.Run("var natspec = require('natspec');")
  18. if err != nil {
  19. return
  20. }
  21. return
  22. }
  23. func (self *NatSpec) Notice(transaction, abi, method, expression string) (string, error) {
  24. var err error
  25. if _, err = self.jsvm.Run("var transaction = " + transaction + ";"); err != nil {
  26. return "", fmt.Errorf("natspec.js error setting transaction: %v", err)
  27. }
  28. if _, err = self.jsvm.Run("var abi = " + abi + ";"); err != nil {
  29. return "", fmt.Errorf("natspec.js error setting abi: %v", err)
  30. }
  31. if _, err = self.jsvm.Run("var method = '" + method + "';"); err != nil {
  32. return "", fmt.Errorf("natspec.js error setting method: %v", err)
  33. }
  34. if _, err = self.jsvm.Run("var expression = \"" + expression + "\";"); err != nil {
  35. return "", fmt.Errorf("natspec.js error setting expression: %v", err)
  36. }
  37. self.jsvm.Run("var call = {method: method,abi: abi,transaction: transaction};")
  38. value, err := self.jsvm.Run("natspec.evaluateExpression(expression, call);")
  39. if err != nil {
  40. return "", fmt.Errorf("natspec.js error evaluating expression: %v", err)
  41. }
  42. evalError := "Natspec evaluation failed, wrong input params"
  43. if value.String() == evalError {
  44. return "", fmt.Errorf("natspec.js error evaluating expression: wrong input params in expression '%s'", expression)
  45. }
  46. if len(value.String()) == 0 {
  47. return "", fmt.Errorf("natspec.js error evaluating expression")
  48. }
  49. return value.String(), nil
  50. }