Skip to content

Commit

Permalink
w/ TemplateRenderable
Browse files Browse the repository at this point in the history
  • Loading branch information
stanistan committed Dec 18, 2023
1 parent fc42a3d commit f427fa0
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 22 deletions.
10 changes: 4 additions & 6 deletions render_container_test.go
Expand Up @@ -33,14 +33,12 @@ func tplWithRealSlotFunc(ctx context.Context, tpl *template.Template, slots map[
}

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

func (v ContainerView) Renderable(_ context.Context) (Renderable, error) {
Expand Down
40 changes: 31 additions & 9 deletions renderer.go
Expand Up @@ -7,33 +7,55 @@ import (
"html/template"
)

func Render(ctx context.Context, r AsRenderable) (template.HTML, error) {
func RenderToHTML(ctx context.Context, r Renderable, errHandler any) (template.HTML, error) {
var empty template.HTML

if r == nil {
return template.HTML(""), nil
return empty, nil
}

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

return out, nil
}

func Render(ctx context.Context, v AsRenderable) (template.HTML, error) {
var empty template.HTML

if v == nil {
return empty, nil
}

renderable, err := r.Renderable(ctx)
r, err := v.Renderable(ctx)
if err != nil {
return handleRenderError(ctx, err, r)
return handleRenderError(ctx, err, v)
}

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

return out, nil
}

func RenderToHTML(tpl *template.Template, data any) (template.HTML, error) {
type TemplateRenderable struct {
Tpl *template.Template
Data any
}

func (v TemplateRenderable) RenderToHTML(_ context.Context) (template.HTML, error) {
var empty template.HTML

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

var bs bytes.Buffer
if err := tpl.Execute(&bs, data); err != nil {
if err := v.Tpl.Execute(&bs, v.Data); err != nil {
return empty, fmt.Errorf("tpl.Execute(): %w", err)
}

Expand Down
12 changes: 5 additions & 7 deletions view.go
Expand Up @@ -13,15 +13,13 @@ type View struct {
}

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 RenderToHTML(tpl, v.Data)
return TemplateRenderable{
Tpl: v.Slots.addToTemplate(ctx, v.Tpl),
Data: v.Data,
}.RenderToHTML(ctx)
}

func (v View) Renderable(_ context.Context) (Renderable, error) {
func (v View) Renderable(ctx context.Context) (Renderable, error) {
return v, nil
}

Expand Down

0 comments on commit f427fa0

Please sign in to comment.