Skip to content

Commit

Permalink
RenderToHML()
Browse files Browse the repository at this point in the history
  • Loading branch information
stanistan committed Dec 15, 2023
1 parent 1b03e86 commit 7130ec0
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 37 deletions.
18 changes: 9 additions & 9 deletions render_container_test.go
Expand Up @@ -32,15 +32,15 @@ func tplWithRealSlotFunc(ctx context.Context, tpl *template.Template, slots map[
})
}

func (v ContainerView) Template(ctx context.Context) (*template.Template, error) {
return tplWithRealSlotFunc(ctx, containerViewTpl, map[string]AsRenderable{
"heading": v.Heading,
"body": v.Body,
}), nil
}

func (v ContainerView) TemplateData(_ context.Context) (any, error) {
return nil, nil
func (v ContainerView) RenderToHTML(ctx context.Context) (template.HTML, error) {
return RenderToHTML(tplWithRealSlotFunc(
ctx,
containerViewTpl,
map[string]AsRenderable{
"heading": v.Heading,
"body": v.Body,
},
), nil)
}

func (v ContainerView) Renderable(_ context.Context) (Renderable, error) {
Expand Down
10 changes: 3 additions & 7 deletions renderable.go
Expand Up @@ -5,14 +5,10 @@ import (
"html/template"
)

// Renderable represents any struct that can be rendered
// in the Render function.
// Renderable represents anything that can be rendered
// to HTML.
type Renderable interface {
// Template provides the template object / parsed and compiled,
// that Render will execute given a context.
Template(ctx context.Context) (*template.Template, error)
// TemplateData provides the data to the template given a context.
TemplateData(ctx context.Context) (any, error)
RenderToHTML(ctx context.Context) (template.HTML, error)
}

type AsRenderable interface {
Expand Down
14 changes: 2 additions & 12 deletions renderer.go
Expand Up @@ -17,31 +17,21 @@ func Render(ctx context.Context, r AsRenderable) (template.HTML, error) {
return handleRenderError(ctx, err, r)
}

out, err := render(ctx, renderable)
out, err := renderable.RenderToHTML(ctx)
if err != nil {
return handleRenderError(ctx, err, r)
}

return out, nil
}

func render(ctx context.Context, r Renderable) (template.HTML, error) {
func RenderToHTML(tpl *template.Template, data any) (template.HTML, error) {
var empty template.HTML

tpl, err := r.Template(ctx)
if err != nil {
return empty, fmt.Errorf("Template(): %w", err)
}

if tpl == nil {
return empty, fmt.Errorf("missing template")
}

data, err := r.TemplateData(ctx)
if err != nil {
return empty, fmt.Errorf("TemplateData(): %w", err)
}

var bs bytes.Buffer
if err := tpl.Execute(&bs, data); err != nil {
return empty, fmt.Errorf("tpl.Execute(): %w", err)
Expand Down
14 changes: 5 additions & 9 deletions view.go
Expand Up @@ -2,7 +2,6 @@ package veun

import (
"context"
"fmt"
"html/template"
"io/fs"
)
Expand All @@ -13,16 +12,13 @@ type View struct {
Data any
}

func (v View) Template(ctx context.Context) (*template.Template, error) {
if v.Tpl == nil {
return nil, fmt.Errorf("template missing")
func (v View) RenderToHTML(ctx context.Context) (template.HTML, error) {
tpl := v.Tpl
if v.Tpl != nil {
tpl = v.Slots.addToTemplate(ctx, v.Tpl)
}

return v.Slots.addToTemplate(ctx, v.Tpl), nil
}

func (v View) TemplateData(_ context.Context) (any, error) {
return v.Data, nil
return RenderToHTML(tpl, v.Data)
}

func (v View) Renderable(_ context.Context) (Renderable, error) {
Expand Down

0 comments on commit 7130ec0

Please sign in to comment.