go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

commit 4e98f1a54ce96c72c66d1f85b2f9d756ece6f298
parent 218086c8a3ca500940df4023ce8aabf5e331c535
Author: lash <dev@holbrook.no>
Date:   Fri, 21 Apr 2023 20:34:46 +0100

Pass context to render methods

Diffstat:
Mrender/page.go | 19++++++++++---------
Mrender/size_test.go | 20+++++++++++++-------
Mresource/fs.go | 2+-
Mresource/resource.go | 8++++----
Mresource/resource_test.go | 2+-
Mvm/runner.go | 4++--
Mvm/runner_test.go | 2+-
7 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/render/page.go b/render/page.go @@ -2,6 +2,7 @@ package render import ( "bytes" + "context" "fmt" "strings" "text/template" @@ -129,8 +130,8 @@ func(pg *Page) Sizes() (map[string]uint16, error) { } // RenderTemplate is an adapter to implement the builtin golang text template renderer as resource.RenderTemplate. -func(pg *Page) RenderTemplate(sym string, values map[string]string, idx uint16) (string, error) { - tpl, err := pg.resource.GetTemplate(sym) +func(pg *Page) RenderTemplate(sym string, values map[string]string, idx uint16, ctx context.Context) (string, error) { + tpl, err := pg.resource.GetTemplate(sym, ctx) if err != nil { return "", err } @@ -159,15 +160,15 @@ func(pg *Page) RenderTemplate(sym string, values map[string]string, idx uint16) } // Render renders the current mapped content and menu state against the template associated with the symbol. -func(pg *Page) Render(sym string, idx uint16) (string, error) { +func(pg *Page) Render(sym string, idx uint16, ctx context.Context) (string, error) { var err error - values, err := pg.prepare(sym, pg.cacheMap, idx) + values, err := pg.prepare(sym, pg.cacheMap, idx, ctx) if err != nil { return "", err } - return pg.render(sym, values, idx) + return pg.render(sym, values, idx, ctx) } // Reset prepared the Page object for re-use. @@ -184,7 +185,7 @@ func(pg *Page) Reset() { // render menu and all syms except sink, split sink into display chunks // TODO: Function too long, split up -func(pg *Page) prepare(sym string, values map[string]string, idx uint16) (map[string]string, error) { +func(pg *Page) prepare(sym string, values map[string]string, idx uint16, ctx context.Context) (map[string]string, error) { var sink string if pg.sizer == nil { @@ -213,7 +214,7 @@ func(pg *Page) prepare(sym string, values map[string]string, idx uint16) (map[st } pg.sizer.AddCursor(0) - s, err := pg.render(sym, noSinkValues, 0) + s, err := pg.render(sym, noSinkValues, 0, ctx) if err != nil { return nil, err } @@ -305,10 +306,10 @@ func(pg *Page) prepare(sym string, values map[string]string, idx uint16) (map[st } // render template, menu (if it exists), and audit size constraint (if it exists). -func(pg *Page) render(sym string, values map[string]string, idx uint16) (string, error) { +func(pg *Page) render(sym string, values map[string]string, idx uint16, ctx context.Context) (string, error) { var ok bool r := "" - s, err := pg.RenderTemplate(sym, values, idx) + s, err := pg.RenderTemplate(sym, values, idx, ctx) if err != nil { return "", err } diff --git a/render/size_test.go b/render/size_test.go @@ -14,7 +14,7 @@ type TestSizeResource struct { *resource.MenuResource } -func getTemplate(sym string) (string, error) { +func getTemplate(sym string, ctx context.Context) (string, error) { var tpl string switch sym { case "small": @@ -124,12 +124,13 @@ func TestSizeLimit(t *testing.T) { mn.Put("1", "foo the foo") mn.Put("2", "go to bar") - _, err = pg.Render("small", 0) + ctx := context.TODO() + _, err = pg.Render("small", 0, ctx) if err != nil { t.Fatal(err) } - _, err = pg.Render("toobig", 0) + _, err = pg.Render("toobig", 0, ctx) if err == nil { t.Fatalf("expected size exceeded") } @@ -159,7 +160,8 @@ func TestSizePages(t *testing.T) { mn.Put("1", "foo the foo") mn.Put("2", "go to bar") - r, err := pg.Render("pages", 0) + ctx := context.TODO() + r, err := pg.Render("pages", 0, ctx) if err != nil { t.Fatal(err) } @@ -176,7 +178,7 @@ lala poo if r != expect { t.Fatalf("expected:\n\t%x\ngot:\n\t%x\n", expect, r) } - r, err = pg.Render("pages", 1) + r, err = pg.Render("pages", 1, ctx) if err != nil { t.Fatal(err) } @@ -214,7 +216,9 @@ func TestManySizes(t *testing.T) { pg.Map("bar") pg.Map("baz") pg.Map("xyzzy") - _, err := pg.Render("pages", 0) + + ctx := context.TODO() + _, err := pg.Render("pages", 0, ctx) if err != nil { t.Fatal(err) } @@ -244,7 +248,9 @@ func TestManySizesMenued(t *testing.T) { pg.Map("xyzzy") mn.Put("0", "yay") mn.Put("12", "nay") - _, err := pg.Render("pages", 0) + + ctx := context.TODO() + _, err := pg.Render("pages", 0, ctx) if err != nil { t.Fatal(err) } diff --git a/resource/fs.go b/resource/fs.go @@ -27,7 +27,7 @@ func NewFsResource(path string) (FsResource) { } } -func(fs FsResource) GetTemplate(sym string) (string, error) { +func(fs FsResource) GetTemplate(sym string, ctx context.Context) (string, error) { fp := path.Join(fs.Path, sym) r, err := ioutil.ReadFile(fp) s := string(r) diff --git a/resource/resource.go b/resource/resource.go @@ -14,12 +14,12 @@ type Result struct { // EntryFunc is a function signature for retrieving value for a key type EntryFunc func(sym string, input []byte, ctx context.Context) (Result, error) type CodeFunc func(sym string) ([]byte, error) -type TemplateFunc func(sym string) (string, error) +type TemplateFunc func(sym string, ctx context.Context) (string, error) type FuncForFunc func(sym string) (EntryFunc, error) // Resource implementation are responsible for retrieving values and templates for symbols, and can render templates from value dictionaries. type Resource interface { - GetTemplate(sym string) (string, error) // Get the template for a given symbol. + GetTemplate(sym string, ctx context.Context) (string, error) // Get the template for a given symbol. GetCode(sym string) ([]byte, error) // Get the bytecode for the given symbol. FuncFor(sym string) (EntryFunc, error) // Resolve symbol content point for. } @@ -68,6 +68,6 @@ func(m *MenuResource) GetCode(sym string) ([]byte, error) { } // GetTemplate implements Resource interface -func(m *MenuResource) GetTemplate(sym string) (string, error) { - return m.templateFunc(sym) +func(m *MenuResource) GetTemplate(sym string, ctx context.Context) (string, error) { + return m.templateFunc(sym, ctx) } diff --git a/resource/resource_test.go b/resource/resource_test.go @@ -10,7 +10,7 @@ type TestSizeResource struct { *MenuResource } -func getTemplate(sym string) (string, error) { +func getTemplate(sym string, ctx context.Context) (string, error) { var tpl string switch sym { case "small": diff --git a/vm/runner.go b/vm/runner.go @@ -451,7 +451,7 @@ func(vm *Vm) Render(ctx context.Context) (string, error) { return "", nil } sym, idx := vm.st.Where() - r, err := vm.pg.Render(sym, idx) + r, err := vm.pg.Render(sym, idx, ctx) var ok bool _, ok = err.(*render.BrowseError) if ok { @@ -459,7 +459,7 @@ func(vm *Vm) Render(ctx context.Context) (string, error) { b := NewLine(nil, MOVE, []string{"_catch"}, nil, nil) vm.Run(b, ctx) sym, idx := vm.st.Where() - r, err = vm.pg.Render(sym, idx) + r, err = vm.pg.Render(sym, idx, ctx) } if err != nil { return "", err diff --git a/vm/runner_test.go b/vm/runner_test.go @@ -73,7 +73,7 @@ type TestStatefulResolver struct { state *state.State } -func (r TestResource) GetTemplate(sym string) (string, error) { +func (r TestResource) GetTemplate(sym string, ctx context.Context) (string, error) { switch sym { case "foo": return "inky pinky blinky clyde", nil