Improved REPL output
This commit is contained in:
parent
16421106d4
commit
017bbbb582
|
@ -15,16 +15,15 @@ import (
|
|||
|
||||
const Debug = true
|
||||
|
||||
// Register interrupt handlers so we can stop the ethereum
|
||||
func RegisterInterrupts(s *eth.Ethereum) {
|
||||
// Buffered chan of one is enough
|
||||
c := make(chan os.Signal, 1)
|
||||
// Notify about interrupts for now
|
||||
signal.Notify(c, os.Interrupt)
|
||||
func RegisterInterrupt(cb func(os.Signal)) {
|
||||
go func() {
|
||||
// Buffered chan of one is enough
|
||||
c := make(chan os.Signal, 1)
|
||||
// Notify about interrupts for now
|
||||
signal.Notify(c, os.Interrupt)
|
||||
|
||||
for sig := range c {
|
||||
fmt.Printf("Shutting down (%v) ... \n", sig)
|
||||
s.Stop()
|
||||
cb(sig)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
@ -154,13 +153,20 @@ save these words so you can restore your account later: %s
|
|||
repl := NewJSRepl(ethereum)
|
||||
|
||||
go repl.Start()
|
||||
|
||||
RegisterInterrupt(func(os.Signal) {
|
||||
repl.Stop()
|
||||
})
|
||||
}
|
||||
|
||||
if StartRpc {
|
||||
utils.DoRpc(ethereum, RpcPort)
|
||||
}
|
||||
|
||||
RegisterInterrupts(ethereum)
|
||||
RegisterInterrupt(func(sig os.Signal) {
|
||||
fmt.Printf("Shutting down (%v) ... \n", sig)
|
||||
ethereum.Stop()
|
||||
})
|
||||
|
||||
ethereum.Start(UseSeed)
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
|
||||
type Repl interface {
|
||||
Start()
|
||||
Stop()
|
||||
}
|
||||
|
||||
type JSRE struct {
|
||||
|
@ -36,6 +37,9 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
|
|||
make(map[string][]otto.Value),
|
||||
}
|
||||
|
||||
// Init the JS lib
|
||||
re.vm.Run(jsLib)
|
||||
|
||||
// We have to make sure that, whoever calls this, calls "Stop"
|
||||
go re.mainLoop()
|
||||
|
||||
|
@ -113,6 +117,10 @@ func (self *JSRepl) Start() {
|
|||
self.read()
|
||||
}
|
||||
|
||||
func (self *JSRepl) Stop() {
|
||||
self.re.Stop()
|
||||
}
|
||||
|
||||
func (self *JSRepl) parseInput(code string) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
|
@ -126,7 +134,7 @@ func (self *JSRepl) parseInput(code string) {
|
|||
return
|
||||
}
|
||||
|
||||
fmt.Println(value)
|
||||
self.PrintValue(value)
|
||||
}
|
||||
|
||||
// The JSEthereum object attempts to wrap the PEthereum object and returns
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
package main
|
||||
|
||||
const jsLib = `
|
||||
function pp(object) {
|
||||
var str = "";
|
||||
|
||||
if(object instanceof Array) {
|
||||
str += "[ ";
|
||||
for(var i = 0, l = object.length; i < l; i++) {
|
||||
str += pp(object[i]);
|
||||
|
||||
if(i < l-1) {
|
||||
str += ", ";
|
||||
}
|
||||
}
|
||||
str += " ]";
|
||||
} else if(typeof(object) === "object") {
|
||||
str += "{ ";
|
||||
var last = Object.keys(object).sort().pop()
|
||||
for(var k in object) {
|
||||
str += k + ": " + pp(object[k]);
|
||||
|
||||
if(k !== last) {
|
||||
str += ", ";
|
||||
}
|
||||
}
|
||||
str += " }";
|
||||
} else if(typeof(object) === "string") {
|
||||
str += "\033[32m'" + object + "'";
|
||||
} else if(typeof(object) === "undefined") {
|
||||
str += "\033[1m\033[30m" + object;
|
||||
} else if(typeof(object) === "number") {
|
||||
str += "\033[31m" + object;
|
||||
} else {
|
||||
str += object;
|
||||
}
|
||||
|
||||
str += "\033[0m";
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
function prettyPrint(object) {
|
||||
console.log(pp(object))
|
||||
}
|
||||
`
|
|
@ -8,6 +8,7 @@ package main
|
|||
import "C"
|
||||
|
||||
import (
|
||||
"github.com/robertkrimen/otto"
|
||||
"strings"
|
||||
"unsafe"
|
||||
)
|
||||
|
@ -63,18 +64,30 @@ L:
|
|||
for {
|
||||
switch result := readLine(&self.prompt); true {
|
||||
case result == nil:
|
||||
break L //exit loop
|
||||
break L
|
||||
|
||||
case *result != "": //ignore blank lines
|
||||
case *result != "":
|
||||
str += *result + "\n"
|
||||
|
||||
self.setIndent()
|
||||
|
||||
if indentCount <= 0 {
|
||||
if *result == "exit" {
|
||||
self.Stop()
|
||||
break L
|
||||
}
|
||||
|
||||
addHistory(str) //allow user to recall this line
|
||||
|
||||
self.parseInput(str)
|
||||
|
||||
str = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (self *JSRepl) PrintValue(value otto.Value) {
|
||||
method, _ := self.re.vm.Get("prettyPrint")
|
||||
method.Call(method, value)
|
||||
}
|
||||
|
|
|
@ -18,3 +18,7 @@ func (self *JSRepl) read() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (self *JSRepl) PrintValue(value otto.Value) {
|
||||
fmt.Println(value)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue