Add engine object
This commit is contained in:
48
go/engine/engine.go
Normal file
48
go/engine/engine.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"log"
|
||||
|
||||
"git.defalsify.org/festive/resource"
|
||||
"git.defalsify.org/festive/state"
|
||||
"git.defalsify.org/festive/vm"
|
||||
)
|
||||
//
|
||||
//type Config struct {
|
||||
// FlagCount uint32
|
||||
// CacheSize uint32
|
||||
//}
|
||||
|
||||
type Engine struct {
|
||||
st state.State
|
||||
rs resource.Resource
|
||||
}
|
||||
|
||||
func NewEngine(st state.State, rs resource.Resource) Engine {
|
||||
engine := Engine{st, rs}
|
||||
return engine
|
||||
}
|
||||
|
||||
func(en *Engine) Init(ctx context.Context) error {
|
||||
b := vm.NewLine([]byte{}, vm.MOVE, []string{"root"}, nil, nil)
|
||||
var err error
|
||||
en.st, _, err = vm.Run(b, en.st, en.rs, ctx)
|
||||
return err
|
||||
}
|
||||
|
||||
func(en *Engine) WriteResult(w io.Writer) error {
|
||||
location := en.st.Where()
|
||||
v, err := en.st.Get()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r, err := en.rs.RenderTemplate(location, v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c, err := io.WriteString(w, r)
|
||||
log.Printf("%v bytes written as result for %v", c, location)
|
||||
return err
|
||||
}
|
||||
81
go/engine/engine_test.go
Normal file
81
go/engine/engine_test.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"log"
|
||||
"path"
|
||||
"text/template"
|
||||
"testing"
|
||||
|
||||
testdataloader "github.com/peteole/testdata-loader"
|
||||
|
||||
"git.defalsify.org/festive/state"
|
||||
"git.defalsify.org/festive/resource"
|
||||
)
|
||||
|
||||
type FsWrapper struct {
|
||||
*resource.FsResource
|
||||
st state.State
|
||||
}
|
||||
|
||||
func NewFsWrapper(path string, st state.State, ctx context.Context) FsWrapper {
|
||||
rs := resource.NewFsResource(path, ctx)
|
||||
return FsWrapper {
|
||||
&rs,
|
||||
st,
|
||||
}
|
||||
}
|
||||
|
||||
func (r FsWrapper) RenderTemplate(sym string, values map[string]string) (string, error) {
|
||||
v, err := r.GetTemplate(sym)
|
||||
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
|
||||
}
|
||||
log.Printf("template is %v render is %v", v, b)
|
||||
return b.String(), err
|
||||
}
|
||||
|
||||
func(fs FsWrapper) FuncFor(sym string) (resource.EntryFunc, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func TestEngineInit(t *testing.T) {
|
||||
// cfg := Config{
|
||||
// FlagCount: 12,
|
||||
// CacheSize: 1024,
|
||||
// }
|
||||
st := state.NewState(17).WithCacheSize(1024)
|
||||
// dir, err := ioutil.TempDir("", "festive_test_")
|
||||
// if err != nil {
|
||||
// t.Fatal(err)
|
||||
// }
|
||||
dir := path.Join(testdataloader.GetBasePath(), "testdata")
|
||||
ctx := context.TODO()
|
||||
rs := NewFsWrapper(dir, st, ctx)
|
||||
en := NewEngine(st, rs)
|
||||
err := en.Init(ctx)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
w := bytes.NewBuffer(nil)
|
||||
err = en.WriteResult(w)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
b := w.Bytes()
|
||||
if !bytes.Equal(b, []byte("hello world")) {
|
||||
t.Fatalf("expected result 'hello world', got %v", b)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user