Skip to content

Template func map cannot access an value set by an interceptor #16

@rafaeljusto

Description

@rafaeljusto

Here's an small example where an interceptor is called, but the value set by the interceptor is not visible for a template function. (running on http://localhost:8089)

package main

import (
    "fmt"
    "html/template"
    "net"
    "net/http"

    "github.com/registrobr/trama"
)

//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////

func main() {
    mux := trama.New(nil)
    mux.RegisterPage("/", func() trama.WebHandler {
        return new(test)
    })

    if err := mux.ParseTemplates(); err != nil {
        fmt.Println(err)
        return
    }

    ln, err := net.Listen("tcp", "127.0.0.1:8089")
    if err != nil {
        fmt.Printf("Error listening to interface. Details: %s\n", err)
        return
    }

    server := http.Server{
        Handler: mux,
    }

    panic(server.Serve(ln))
}

//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////

type test struct {
    trama.DefaultWebHandler
    testerCompliant
}

func (t *test) Get(response trama.Response, r *http.Request) error {
    response.SetTemplateGroup("en")
    response.ExecuteTemplate("test.html", nil)
    return nil
}

func (t *test) Templates() trama.TemplateGroupSet {
    groupSet := trama.NewTemplateGroupSet(template.FuncMap{
        "test": func() string {
            return t.Message()
        },
    })
    groupSet.Insert(trama.TemplateGroup{
        Name:  "en",
        Files: []string{"test.html"},
    })
    return groupSet
}

func (t *test) Interceptors() trama.WebInterceptorChain {
    return trama.NewWebInterceptorChain(
        newTestInterceptor(t),
    )
}

//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////

type tester interface {
    SetMessage(msg string)
    Message() string
}

type testInterceptor struct {
    trama.NopWebInterceptor
    handler tester
}

func newTestInterceptor(h tester) *testInterceptor {
    return &testInterceptor{handler: h}
}

func (t testInterceptor) Before(response trama.Response, r *http.Request) error {
    t.handler.SetMessage("This is a test message!")
    return nil
}

type testerCompliant struct {
    msg string
}

func (t *testerCompliant) SetMessage(msg string) {
    t.msg = msg
}

func (t testerCompliant) Message() string {
    return t.msg
}

You should have a file named "test.html" in the same folder where you are running the program, the content of this file should be:

<!DOCTYPE html>
<html lang="en">
    <body>
        <h1>Expected: “This is a test message!”</h1>
        <h1>Got: “{{test}}”</h1>
    </body>
</html>

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions