Add dynamic file reader alternative for funcfor in fs resource
This commit is contained in:
parent
8ddfd68f33
commit
084b23babd
@ -32,11 +32,11 @@ func NewFsWrapper(path string, st *state.State) FsWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
func(fs FsWrapper) one(ctx context.Context) (string, error) {
|
||||
func(fs FsWrapper) one(sym string, ctx context.Context) (string, error) {
|
||||
return "one", nil
|
||||
}
|
||||
|
||||
func(fs FsWrapper) inky(ctx context.Context) (string, error) {
|
||||
func(fs FsWrapper) inky(sym string, ctx context.Context) (string, error) {
|
||||
return "tinkywinky", nil
|
||||
}
|
||||
|
||||
|
@ -156,6 +156,11 @@ func(pg *Page) RenderTemplate(sym string, values map[string]string, idx uint16)
|
||||
// render menu and all syms except sink, split sink into display chunks
|
||||
func(pg *Page) prepare(sym string, values map[string]string, idx uint16) (map[string]string, error) {
|
||||
var sink string
|
||||
|
||||
if pg.sizer == nil {
|
||||
return values, nil
|
||||
}
|
||||
|
||||
var sinkValues []string
|
||||
noSinkValues := make(map[string]string)
|
||||
for k, v := range values {
|
||||
|
@ -41,19 +41,19 @@ func funcFor(sym string) (resource.EntryFunc, error) {
|
||||
return nil, fmt.Errorf("unknown func: %s", sym)
|
||||
}
|
||||
|
||||
func getFoo(ctx context.Context) (string, error) {
|
||||
func getFoo(sym string, ctx context.Context) (string, error) {
|
||||
return "inky", nil
|
||||
}
|
||||
|
||||
func getBar(ctx context.Context) (string, error) {
|
||||
func getBar(sym string, ctx context.Context) (string, error) {
|
||||
return "pinky", nil
|
||||
}
|
||||
|
||||
func getBaz(ctx context.Context) (string, error) {
|
||||
func getBaz(sym string, ctx context.Context) (string, error) {
|
||||
return "blinky", nil
|
||||
}
|
||||
|
||||
func getXyzzy(ctx context.Context) (string, error) {
|
||||
func getXyzzy(sym string, ctx context.Context) (string, error) {
|
||||
return "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve", nil
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package resource
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"path"
|
||||
@ -11,6 +12,7 @@ import (
|
||||
type FsResource struct {
|
||||
MenuResource
|
||||
Path string
|
||||
fns map[string]EntryFunc
|
||||
}
|
||||
|
||||
func NewFsResource(path string) (FsResource) {
|
||||
@ -37,9 +39,32 @@ func(fs FsResource) GetCode(sym string) ([]byte, error) {
|
||||
}
|
||||
|
||||
func(fs FsResource) FuncFor(sym string) (EntryFunc, error) {
|
||||
return nil, fmt.Errorf("not implemented")
|
||||
fn, ok := fs.fns[sym]
|
||||
if ok {
|
||||
return fn, nil
|
||||
}
|
||||
_, err := fs.getFuncNoCtx(sym)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unknown sym: %s", sym)
|
||||
}
|
||||
return fs.getFunc, nil
|
||||
}
|
||||
|
||||
func(rs FsResource) String() string {
|
||||
return fmt.Sprintf("fs resource at path: %s", rs.Path)
|
||||
func(fs FsResource) String() string {
|
||||
return fmt.Sprintf("fs resource at path: %s", fs.Path)
|
||||
}
|
||||
|
||||
func(fs FsResource) getFunc(sym string, ctx context.Context) (string, error) {
|
||||
return fs.getFuncNoCtx(sym)
|
||||
}
|
||||
|
||||
func(fs FsResource) getFuncNoCtx(sym string) (string, error) {
|
||||
fb := sym + ".txt"
|
||||
fp := path.Join(fs.Path, fb)
|
||||
r, err := ioutil.ReadFile(fp)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed getting data for sym '%s': %v", sym, err)
|
||||
}
|
||||
s := string(r)
|
||||
return strings.TrimSpace(s), err
|
||||
}
|
||||
|
@ -1,40 +0,0 @@
|
||||
package resource
|
||||
|
||||
//import (
|
||||
// "bytes"
|
||||
// "fmt"
|
||||
// "log"
|
||||
// "text/template"
|
||||
//)
|
||||
|
||||
|
||||
//// DefaultRenderTemplate is an adapter to implement the builtin golang text template renderer as resource.RenderTemplate.
|
||||
//func DefaultRenderTemplate(r Resource, sym string, values map[string]string, idx uint16, sizer *Sizer) (string, error) {
|
||||
// v, err := r.GetTemplate(sym, nil)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
//
|
||||
// if sizer != nil {
|
||||
// values, err = sizer.GetAt(values, idx)
|
||||
// } else if idx > 0 {
|
||||
// return "", fmt.Errorf("sizer needed for indexed render")
|
||||
// }
|
||||
// log.Printf("render for index: %v", idx)
|
||||
//
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
//
|
||||
// tp, err := template.New("tester").Option("missingkey=error").Parse(v)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
//
|
||||
// b := bytes.NewBuffer([]byte{})
|
||||
// err = tp.Execute(b, values)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// return b.String(), err
|
||||
//}
|
@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
// EntryFunc is a function signature for retrieving value for a key
|
||||
type EntryFunc func(ctx context.Context) (string, error)
|
||||
type EntryFunc func(sym string, ctx context.Context) (string, error)
|
||||
type CodeFunc func(sym string) ([]byte, error)
|
||||
type TemplateFunc func(sym string) (string, error)
|
||||
type FuncForFunc func(sym string) (EntryFunc, error)
|
||||
|
@ -26,29 +26,29 @@ func getTemplate(sym string) (string, error) {
|
||||
func funcFor(sym string) (EntryFunc, error) {
|
||||
switch sym {
|
||||
case "foo":
|
||||
return getFoo, nil
|
||||
return get, nil
|
||||
case "bar":
|
||||
return getBar, nil
|
||||
return get, nil
|
||||
case "baz":
|
||||
return getBaz, nil
|
||||
return get, nil
|
||||
case "xyzzy":
|
||||
return getXyzzy, nil
|
||||
}
|
||||
return nil, fmt.Errorf("unknown func: %s", sym)
|
||||
}
|
||||
|
||||
func getFoo(ctx context.Context) (string, error) {
|
||||
return "inky", nil
|
||||
func get(sym string, ctx context.Context) (string, error) {
|
||||
switch sym {
|
||||
case "foo":
|
||||
return "inky", nil
|
||||
case "bar":
|
||||
return "pinky", nil
|
||||
case "baz":
|
||||
return "blinky", nil
|
||||
}
|
||||
return "", fmt.Errorf("unknown sym: %s", sym)
|
||||
}
|
||||
|
||||
func getBar(ctx context.Context) (string, error) {
|
||||
return "pinky", nil
|
||||
}
|
||||
|
||||
func getBaz(ctx context.Context) (string, error) {
|
||||
return "blinky", nil
|
||||
}
|
||||
|
||||
func getXyzzy(ctx context.Context) (string, error) {
|
||||
func getXyzzy(sym string, ctx context.Context) (string, error) {
|
||||
return "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve", nil
|
||||
}
|
||||
|
32
go/testdata/testdata.go
vendored
32
go/testdata/testdata.go
vendored
@ -19,7 +19,7 @@ var (
|
||||
dirLock = false
|
||||
)
|
||||
|
||||
func out(sym string, b []byte, tpl string) error {
|
||||
func out(sym string, b []byte, tpl string, data map[string]string) error {
|
||||
fp := path.Join(DataDir, sym)
|
||||
err := ioutil.WriteFile(fp, []byte(tpl), 0644)
|
||||
if err != nil {
|
||||
@ -32,6 +32,20 @@ func out(sym string, b []byte, tpl string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if data == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
for k, v := range data {
|
||||
fb := k + ".txt"
|
||||
fp = path.Join(DataDir, fb)
|
||||
err = ioutil.WriteFile(fp, []byte(v), 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -45,7 +59,7 @@ func root() error {
|
||||
|
||||
tpl := "hello world"
|
||||
|
||||
return out("root", b, tpl)
|
||||
return out("root", b, tpl, nil)
|
||||
}
|
||||
|
||||
func foo() error {
|
||||
@ -58,11 +72,14 @@ func foo() error {
|
||||
b = vm.NewLine(b, vm.INCMP, []string{"1", "baz"}, nil, nil)
|
||||
b = vm.NewLine(b, vm.CATCH, []string{"_catch"}, []byte{1}, []uint8{1})
|
||||
|
||||
data := make(map[string]string)
|
||||
data["inky"] = "one"
|
||||
|
||||
tpl := `this is in foo
|
||||
|
||||
it has more lines`
|
||||
|
||||
return out("foo", b, tpl)
|
||||
return out("foo", b, tpl, data)
|
||||
}
|
||||
|
||||
func bar() error {
|
||||
@ -73,7 +90,10 @@ func bar() error {
|
||||
|
||||
tpl := "this is bar - an end node"
|
||||
|
||||
return out("bar", b, tpl)
|
||||
data := make(map[string]string)
|
||||
data["pinky"] = "two"
|
||||
|
||||
return out("bar", b, tpl, data)
|
||||
}
|
||||
|
||||
func baz() error {
|
||||
@ -83,7 +103,7 @@ func baz() error {
|
||||
|
||||
tpl := "this is baz which uses the var {{.inky}} in the template."
|
||||
|
||||
return out("baz", b, tpl)
|
||||
return out("baz", b, tpl, nil)
|
||||
}
|
||||
|
||||
func defaultCatch() error {
|
||||
@ -94,7 +114,7 @@ func defaultCatch() error {
|
||||
|
||||
tpl := "invalid input"
|
||||
|
||||
return out("_catch", b, tpl)
|
||||
return out("_catch", b, tpl, nil)
|
||||
}
|
||||
|
||||
func generate() error {
|
||||
|
@ -345,6 +345,6 @@ func refresh(key string, rs resource.Resource, ctx context.Context) (string, err
|
||||
if fn == nil {
|
||||
return "", fmt.Errorf("no retrieve function for external symbol %v", key)
|
||||
}
|
||||
return fn(ctx)
|
||||
return fn(key, ctx)
|
||||
}
|
||||
|
||||
|
@ -20,15 +20,15 @@ type TestResource struct {
|
||||
state *state.State
|
||||
}
|
||||
|
||||
func getOne(ctx context.Context) (string, error) {
|
||||
func getOne(sym string, ctx context.Context) (string, error) {
|
||||
return "one", nil
|
||||
}
|
||||
|
||||
func getTwo(ctx context.Context) (string, error) {
|
||||
func getTwo(sym string, ctx context.Context) (string, error) {
|
||||
return "two", nil
|
||||
}
|
||||
|
||||
func getDyn(ctx context.Context) (string, error) {
|
||||
func getDyn(sym string, ctx context.Context) (string, error) {
|
||||
return dynVal, nil
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ func (r TestResource) FuncFor(sym string) (resource.EntryFunc, error) {
|
||||
return nil, fmt.Errorf("invalid function: '%s'", sym)
|
||||
}
|
||||
|
||||
func(r TestResource) getInput(ctx context.Context) (string, error) {
|
||||
func(r TestResource) getInput(sym string, ctx context.Context) (string, error) {
|
||||
v, err := r.state.GetInput()
|
||||
return string(v), err
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user