Skip to content

Commit 745d3ae

Browse files
committed
with initial view.go and test
1 parent 510eb19 commit 745d3ae

File tree

3 files changed

+68
-13
lines changed

3 files changed

+68
-13
lines changed

render_container_as_view_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package veun_test
2+
3+
import (
4+
"html/template"
5+
"testing"
6+
7+
"github.com/alecthomas/assert/v2"
8+
9+
. "github.com/stanistan/veun"
10+
)
11+
12+
func TestRenderContainerAsView(t *testing.T) {
13+
html, err := Render(View{
14+
Tpl: containerViewTpl,
15+
Slots: map[string]Renderable{
16+
"heading": ChildView1{},
17+
"body": ChildView2{},
18+
},
19+
})
20+
assert.NoError(t, err)
21+
assert.Equal(t, template.HTML(`<div>
22+
<div class="heading">HEADING</div>
23+
<div class="body">BODY</div>
24+
</div>`), html)
25+
26+
}

render_container_test.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,12 @@ import (
99
. "github.com/stanistan/veun"
1010
)
1111

12-
func slotFuncStub(name string) (template.HTML, error) {
13-
return template.HTML(""), nil
14-
}
15-
1612
type ContainerView struct {
1713
Heading Renderable
1814
Body Renderable
1915
}
2016

21-
func mustParseTemplate(name, contents string) *template.Template {
22-
return template.Must(
23-
template.New(name).
24-
Funcs(template.FuncMap{"slot": slotFuncStub}).
25-
Parse(contents),
26-
)
27-
}
28-
29-
var containerViewTpl = mustParseTemplate("containerView", `<div>
17+
var containerViewTpl = MustParseTemplate("containerView", `<div>
3018
<div class="heading">{{ slot "heading" }}</div>
3119
<div class="body">{{ slot "body" }}</div>
3220
</div>`)

view.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package veun
2+
3+
import "html/template"
4+
5+
type View struct {
6+
Tpl *template.Template
7+
Slots map[string]Renderable
8+
Data any
9+
}
10+
11+
func (v View) Template() (*template.Template, error) {
12+
return tplWithRealSlotFunc(v.Tpl, v.Slots), nil
13+
}
14+
15+
func (v View) TemplateData() (any, error) {
16+
return v.Data, nil
17+
}
18+
19+
func tplWithRealSlotFunc(tpl *template.Template, slots map[string]Renderable) *template.Template {
20+
return tpl.Funcs(template.FuncMap{
21+
"slot": func(name string) (template.HTML, error) {
22+
slot, ok := slots[name]
23+
if ok {
24+
return Render(slot)
25+
}
26+
return template.HTML(""), nil
27+
},
28+
})
29+
}
30+
31+
func slotFuncStub(name string) (template.HTML, error) {
32+
return template.HTML(""), nil
33+
}
34+
35+
func MustParseTemplate(name, contents string) *template.Template {
36+
return template.Must(
37+
template.New(name).
38+
Funcs(template.FuncMap{"slot": slotFuncStub}).
39+
Parse(contents),
40+
)
41+
}

0 commit comments

Comments
 (0)