Catch beyond index error in browse
This commit is contained in:
parent
677dbf536f
commit
4da19b3047
1
go/cache/cache.go
vendored
1
go/cache/cache.go
vendored
@ -136,7 +136,6 @@ func(ca *Cache) Reset() {
|
||||
func (ca *Cache) Push() error {
|
||||
m := make(map[string]string)
|
||||
ca.Cache = append(ca.Cache, m)
|
||||
//ca.resetCurrent()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -118,8 +118,8 @@ func (en *Engine) Exec(input []byte, ctx context.Context) (bool, error) {
|
||||
// - required data inputs to the template are not available.
|
||||
// - the template for the given node point is note available for retrieval using the resource.Resource implementer.
|
||||
// - the supplied writer fails to process the writes.
|
||||
func(en *Engine) WriteResult(w io.Writer) error {
|
||||
r, err := en.vm.Render()
|
||||
func(en *Engine) WriteResult(w io.Writer, ctx context.Context) error {
|
||||
r, err := en.vm.Render(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ func TestEngineInit(t *testing.T) {
|
||||
}
|
||||
|
||||
w := bytes.NewBuffer(nil)
|
||||
err = en.WriteResult(w)
|
||||
err = en.WriteResult(w, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -105,7 +105,7 @@ func TestEngineInit(t *testing.T) {
|
||||
t.Fatalf("expected where-string 'foo', got %s", r)
|
||||
}
|
||||
w = bytes.NewBuffer(nil)
|
||||
err = en.WriteResult(w)
|
||||
err = en.WriteResult(w, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ func Loop(en *Engine, startSym string, ctx context.Context, reader io.Reader, wr
|
||||
}
|
||||
|
||||
b := bytes.NewBuffer(nil)
|
||||
en.WriteResult(b)
|
||||
en.WriteResult(b, ctx)
|
||||
fmt.Println(b.String())
|
||||
|
||||
running := true
|
||||
@ -37,7 +37,7 @@ func Loop(en *Engine, startSym string, ctx context.Context, reader io.Reader, wr
|
||||
return fmt.Errorf("unexpected termination: %v\n", err)
|
||||
}
|
||||
//b := bytes.NewBuffer(nil)
|
||||
err = en.WriteResult(writer)
|
||||
err = en.WriteResult(writer, ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -4,6 +4,15 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type BrowseError struct {
|
||||
Idx uint16
|
||||
PageCount uint16
|
||||
}
|
||||
|
||||
func(err *BrowseError) Error() string {
|
||||
return fmt.Sprintf("index is out of bounds: %v", err.Idx)
|
||||
}
|
||||
|
||||
// BrowseConfig defines the availability and display parameters for page browsing.
|
||||
type BrowseConfig struct {
|
||||
NextAvailable bool
|
||||
@ -112,7 +121,8 @@ func(m *Menu) applyPage(idx uint16) error {
|
||||
}
|
||||
return nil
|
||||
} else if idx >= m.pageCount {
|
||||
return fmt.Errorf("index %v out of bounds (%v)", idx, m.pageCount)
|
||||
return &BrowseError{Idx: idx, PageCount: m.pageCount}
|
||||
//return fmt.Errorf("index %v out of bounds (%v)", idx, m.pageCount)
|
||||
}
|
||||
|
||||
m.reset()
|
||||
|
@ -307,20 +307,6 @@ func(pg *Page) render(sym string, values map[string]string, idx uint16) (string,
|
||||
return "", fmt.Errorf("limit exceeded: %v", pg.sizer)
|
||||
}
|
||||
}
|
||||
// s, err = pg.menu.Render(idx)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// log.Printf("rendered %v bytes for menu", len(s))
|
||||
// if len(s) > 0 {
|
||||
// r += "\n" + s
|
||||
// }
|
||||
// if pg.sizer != nil {
|
||||
// _, ok = pg.sizer.Check(r)
|
||||
// if !ok {
|
||||
// return "", fmt.Errorf("limit exceeded: %v", pg.sizer)
|
||||
// }
|
||||
// }
|
||||
return r, nil
|
||||
}
|
||||
|
||||
@ -332,12 +318,11 @@ func(pg *Page) Render(sym string, idx uint16) (string, error) {
|
||||
return "", err
|
||||
}
|
||||
|
||||
log.Printf("nosink %v", values)
|
||||
return pg.render(sym, values, idx)
|
||||
}
|
||||
|
||||
func(pg *Page) Reset() {
|
||||
pg.sink = nil
|
||||
pg.sinkSize = 0
|
||||
//pg.cacheMap = make(map[string]string)
|
||||
pg.cacheMap = make(map[string]string)
|
||||
}
|
||||
|
@ -383,7 +383,7 @@ func(vm *Vm) RunMPrev(b []byte, ctx context.Context) ([]byte, error) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func(vm *Vm) Render() (string, error) {
|
||||
func(vm *Vm) Render(ctx context.Context) (string, error) {
|
||||
changed, err := vm.st.ResetFlag(state.FLAG_DIRTY)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@ -393,6 +393,15 @@ func(vm *Vm) Render() (string, error) {
|
||||
}
|
||||
sym, idx := vm.st.Where()
|
||||
r, err := vm.pg.Render(sym, idx)
|
||||
var ok bool
|
||||
_, ok = err.(*render.BrowseError)
|
||||
if ok {
|
||||
vm.Reset()
|
||||
b := NewLine(nil, MOVE, []string{"_catch"}, nil, nil)
|
||||
vm.Run(b, ctx)
|
||||
sym, idx := vm.st.Where()
|
||||
r, err = vm.pg.Render(sym, idx)
|
||||
}
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
@ -112,16 +112,17 @@ func TestRunLoadRender(t *testing.T) {
|
||||
st.Down("bar")
|
||||
|
||||
var err error
|
||||
ctx := context.TODO()
|
||||
b := NewLine(nil, LOAD, []string{"one"}, []byte{0x0a}, nil)
|
||||
b = NewLine(b, MAP, []string{"one"}, nil, nil)
|
||||
b = NewLine(b, LOAD, []string{"two"}, []byte{0x0a}, nil)
|
||||
b = NewLine(b, MAP, []string{"two"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
b, err = vm.Run(b, context.TODO())
|
||||
b, err = vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
r, err := vm.Render()
|
||||
r, err := vm.Render(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -133,17 +134,17 @@ func TestRunLoadRender(t *testing.T) {
|
||||
b = NewLine(nil, LOAD, []string{"two"}, []byte{0x0a}, nil)
|
||||
b = NewLine(b, MAP, []string{"two"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
b, err = vm.Run(b, context.TODO())
|
||||
b, err = vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
b = NewLine(nil, MAP, []string{"one"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
_, err = vm.Run(b, context.TODO())
|
||||
_, err = vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
r, err = vm.Render()
|
||||
r, err = vm.Render(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -159,11 +160,12 @@ func TestRunMultiple(t *testing.T) {
|
||||
ca := cache.NewCache()
|
||||
vm := NewVm(&st, &rs, ca, nil)
|
||||
|
||||
ctx := context.TODO()
|
||||
b := NewLine(nil, MOVE, []string{"test"}, nil, nil)
|
||||
b = NewLine(b, LOAD, []string{"one"}, []byte{0x00}, nil)
|
||||
b = NewLine(b, LOAD, []string{"two"}, []byte{42}, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
b, err := vm.Run(b, context.TODO())
|
||||
b, err := vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@ -179,15 +181,16 @@ func TestRunReload(t *testing.T) {
|
||||
szr := render.NewSizer(128)
|
||||
vm := NewVm(&st, &rs, ca, szr)
|
||||
|
||||
ctx := context.TODO()
|
||||
b := NewLine(nil, MOVE, []string{"root"}, nil, nil)
|
||||
b = NewLine(b, LOAD, []string{"dyn"}, nil, []uint8{0})
|
||||
b = NewLine(b, MAP, []string{"dyn"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
_, err := vm.Run(b, context.TODO())
|
||||
_, err := vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
r, err := vm.Render()
|
||||
r, err := vm.Render(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -197,7 +200,7 @@ func TestRunReload(t *testing.T) {
|
||||
dynVal = "baz"
|
||||
b = NewLine(nil, RELOAD, []string{"dyn"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
_, err = vm.Run(b, context.TODO())
|
||||
_, err = vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -310,12 +313,14 @@ func TestRunMenu(t *testing.T) {
|
||||
|
||||
var err error
|
||||
|
||||
ctx := context.TODO()
|
||||
|
||||
b := NewLine(nil, MOVE, []string{"foo"}, nil, nil)
|
||||
b = NewLine(b, MOUT, []string{"0", "one"}, nil, nil)
|
||||
b = NewLine(b, MOUT, []string{"1", "two"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
|
||||
b, err = vm.Run(b, context.TODO())
|
||||
b, err = vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@ -324,7 +329,7 @@ func TestRunMenu(t *testing.T) {
|
||||
t.Errorf("expected empty remainder, got length %v: %v", l, b)
|
||||
}
|
||||
|
||||
r, err := vm.Render()
|
||||
r, err := vm.Render(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@ -343,12 +348,14 @@ func TestRunMenuBrowse(t *testing.T) {
|
||||
|
||||
var err error
|
||||
|
||||
ctx := context.TODO()
|
||||
|
||||
b := NewLine(nil, MOVE, []string{"foo"}, nil, nil)
|
||||
b = NewLine(b, MOUT, []string{"0", "one"}, nil, nil)
|
||||
b = NewLine(b, MOUT, []string{"1", "two"}, nil, nil)
|
||||
b = NewLine(b, HALT, nil, nil, nil)
|
||||
|
||||
b, err = vm.Run(b, context.TODO())
|
||||
b, err = vm.Run(b, ctx)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
@ -357,7 +364,7 @@ func TestRunMenuBrowse(t *testing.T) {
|
||||
t.Errorf("expected empty remainder, got length %v: %v", l, b)
|
||||
}
|
||||
|
||||
r, err := vm.Render()
|
||||
r, err := vm.Render(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user