refactor repl
This commit is contained in:
parent
eecff52520
commit
a19cdfdf6f
1 changed files with 73 additions and 71 deletions
144
engine/repl.go
144
engine/repl.go
|
@ -15,11 +15,11 @@ func (g *Game) REPL(src io.Reader, dst io.Writer, assets fs.FS) error {
|
||||||
fmt.Fprint(dst, "game>")
|
fmt.Fprint(dst, "game>")
|
||||||
sc := bufio.NewScanner(src)
|
sc := bufio.NewScanner(src)
|
||||||
for sc.Scan() {
|
for sc.Scan() {
|
||||||
tok := strings.Split(sc.Text(), " ")
|
argv := strings.Split(sc.Text(), " ")
|
||||||
if len(tok) == 0 {
|
if len(argv) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch tok[0] {
|
switch argv[0] {
|
||||||
case "quit":
|
case "quit":
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
case "pause":
|
case "pause":
|
||||||
|
@ -27,78 +27,80 @@ func (g *Game) REPL(src io.Reader, dst io.Writer, assets fs.FS) error {
|
||||||
case "resume", "unpause":
|
case "resume", "unpause":
|
||||||
g.Enable()
|
g.Enable()
|
||||||
case "save":
|
case "save":
|
||||||
if len(tok) != 2 {
|
g.cmdSave(dst, argv)
|
||||||
fmt.Fprintln(dst, "Usage: save ID")
|
|
||||||
break
|
|
||||||
}
|
|
||||||
id := tok[1]
|
|
||||||
c := g.Component(id)
|
|
||||||
if c == nil {
|
|
||||||
fmt.Fprintf(dst, "Component %q not found\n", id)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
s, ok := c.(Saver)
|
|
||||||
if !ok {
|
|
||||||
fmt.Fprintf(dst, "Component %q not a Saver (type %T)\n", id, c)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if err := s.Save(); err != nil {
|
|
||||||
fmt.Fprintf(dst, "Couldn't save %q: %v\n", id, err)
|
|
||||||
}
|
|
||||||
case "reload":
|
case "reload":
|
||||||
g.Disable()
|
g.cmdReload(dst, assets)
|
||||||
g.Hide()
|
|
||||||
if err := g.Load(assets); err != nil {
|
|
||||||
fmt.Fprintf(dst, "Couldn't load: %v\n", err)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
g.Prepare()
|
|
||||||
g.Enable()
|
|
||||||
g.Show()
|
|
||||||
case "tree":
|
case "tree":
|
||||||
if len(tok) < 1 || len(tok) > 2 {
|
g.cmdTree(dst, argv)
|
||||||
fmt.Println(dst, "Usage: tree [ID]")
|
|
||||||
}
|
|
||||||
var c interface{} = g
|
|
||||||
if len(tok) == 2 {
|
|
||||||
// subtree
|
|
||||||
id := tok[1]
|
|
||||||
c = g.Component(id)
|
|
||||||
if c == nil {
|
|
||||||
fmt.Fprintf(dst, "Component %q not found\n", id)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type item struct {
|
|
||||||
c interface{}
|
|
||||||
depth int
|
|
||||||
}
|
|
||||||
stack := []item{{c, 0}}
|
|
||||||
for len(stack) > 0 {
|
|
||||||
tail := len(stack) - 1
|
|
||||||
x := stack[tail]
|
|
||||||
stack = stack[:tail]
|
|
||||||
c := x.c
|
|
||||||
|
|
||||||
indent := ""
|
|
||||||
if x.depth > 0 {
|
|
||||||
indent = strings.Repeat(" ", x.depth-1) + "↳ "
|
|
||||||
}
|
|
||||||
i, ok := c.(Identifier)
|
|
||||||
if ok {
|
|
||||||
fmt.Fprintf(dst, "%s%T %s\n", indent, c, i.Ident())
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(dst, "%s%T\n", indent, c)
|
|
||||||
}
|
|
||||||
|
|
||||||
if s, ok := c.(Scanner); ok {
|
|
||||||
for _, y := range s.Scan() {
|
|
||||||
stack = append(stack, item{y, x.depth + 1})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fmt.Fprint(dst, "game>")
|
fmt.Fprint(dst, "game>")
|
||||||
}
|
}
|
||||||
return sc.Err()
|
return sc.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *Game) cmdSave(dst io.Writer, argv []string) {
|
||||||
|
if len(argv) != 2 {
|
||||||
|
fmt.Fprintln(dst, "Usage: save ID")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id := argv[1]
|
||||||
|
c := g.Component(id)
|
||||||
|
if c == nil {
|
||||||
|
fmt.Fprintf(dst, "Component %q not found\n", id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s, ok := c.(Saver)
|
||||||
|
if !ok {
|
||||||
|
fmt.Fprintf(dst, "Component %q not a Saver (type %T)\n", id, c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := s.Save(); err != nil {
|
||||||
|
fmt.Fprintf(dst, "Couldn't save %q: %v\n", id, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Game) cmdReload(dst io.Writer, assets fs.FS) {
|
||||||
|
g.Disable()
|
||||||
|
g.Hide()
|
||||||
|
if err := g.Load(assets); err != nil {
|
||||||
|
fmt.Fprintf(dst, "Couldn't load: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
g.Prepare()
|
||||||
|
g.Enable()
|
||||||
|
g.Show()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Game) cmdTree(dst io.Writer, argv []string) {
|
||||||
|
if len(argv) < 1 || len(argv) > 2 {
|
||||||
|
fmt.Println(dst, "Usage: tree [ID]")
|
||||||
|
}
|
||||||
|
var c interface{} = g
|
||||||
|
if len(argv) == 2 { // subtree
|
||||||
|
id := argv[1]
|
||||||
|
c = g.Component(id)
|
||||||
|
if c == nil {
|
||||||
|
fmt.Fprintf(dst, "Component %q not found\n", id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var walk func(interface{}, int)
|
||||||
|
walk = func(c interface{}, depth int) {
|
||||||
|
indent := ""
|
||||||
|
if depth > 0 {
|
||||||
|
indent = strings.Repeat(" ", depth-1) + "↳ "
|
||||||
|
}
|
||||||
|
i, ok := c.(Identifier)
|
||||||
|
if ok {
|
||||||
|
fmt.Fprintf(dst, "%s%T %s\n", indent, c, i.Ident())
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(dst, "%s%T\n", indent, c)
|
||||||
|
}
|
||||||
|
if s, ok := c.(Scanner); ok {
|
||||||
|
for _, d := range s.Scan() {
|
||||||
|
walk(d, depth+1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
walk(c, 0)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue