diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-16 04:17:23 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-16 04:17:23 +0800 |
commit | 2ac292dc7ada20d64188b9d35f23600e4642021b (patch) | |
tree | 8dd51cf78bbda7d0ef1a654a3bc4ec11aacfa3f8 /ethereum/javascript_console.go | |
parent | 3a2bddc160ece4dcb6d2d5bcc85091d244e774c0 (diff) | |
parent | 6a78e080e645753ffe3e3bef0b09e71a2469c564 (diff) | |
download | dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.tar dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.tar.gz dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.tar.bz2 dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.tar.lz dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.tar.xz dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.tar.zst dexon-2ac292dc7ada20d64188b9d35f23600e4642021b.zip |
Merge branch 'feature/otto' into develop
Diffstat (limited to 'ethereum/javascript_console.go')
-rw-r--r-- | ethereum/javascript_console.go | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/ethereum/javascript_console.go b/ethereum/javascript_console.go new file mode 100644 index 000000000..9adf51bcc --- /dev/null +++ b/ethereum/javascript_console.go @@ -0,0 +1,108 @@ +package main + +import ( + "bufio" + "fmt" + "github.com/ethereum/eth-go" + "github.com/ethereum/eth-go/ethpub" + "github.com/robertkrimen/otto" + "os" +) + +type JSConsole struct { + vm *otto.Otto + lib *ethpub.PEthereum +} + +func NewJSConsole(ethereum *eth.Ethereum) *JSConsole { + return &JSConsole{vm: otto.New(), lib: ethpub.NewPEthereum(ethereum)} +} + +func (self *JSConsole) Start() { + self.initBindings() + + fmt.Println("Eth JavaScript console") + reader := bufio.NewReader(os.Stdin) + for { + fmt.Printf("eth >>> ") + str, _, err := reader.ReadLine() + if err != nil { + fmt.Println("Error reading input", err) + } else { + self.ParseInput(string(str)) + } + } +} + +func (self *JSConsole) ParseInput(code string) { + defer func() { + if r := recover(); r != nil { + fmt.Println("[native] error", r) + } + }() + + value, err := self.vm.Run(code) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(value) +} + +func (self *JSConsole) initBindings() { + t := &JSWrapper{self.lib, self.vm} + + self.vm.Set("eth", t) +} + +// The JS wrapper attempts to wrap the PEthereum object and returns +// proper javascript objects +type JSWrapper struct { + *ethpub.PEthereum + vm *otto.Otto +} + +func (self *JSWrapper) GetKey() otto.Value { + return self.toVal(self.PEthereum.GetKey()) +} + +func (self *JSWrapper) GetStateObject(addr string) otto.Value { + return self.toVal(self.PEthereum.GetStateObject(addr)) +} + +func (self *JSWrapper) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value { + r, err := self.PEthereum.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) + if err != nil { + fmt.Println(err) + + return otto.UndefinedValue() + } + + return self.toVal(r) +} + +func (self *JSWrapper) Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr string) otto.Value { + r, err := self.PEthereum.Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr) + + if err != nil { + fmt.Println(err) + + return otto.UndefinedValue() + } + + return self.toVal(r) +} + +// Wrapper function +func (self *JSWrapper) toVal(v interface{}) otto.Value { + result, err := self.vm.ToValue(v) + + if err != nil { + fmt.Println(err) + + return otto.UndefinedValue() + } + + return result +} |