55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/a-h/templ"
|
|
)
|
|
|
|
func main() {
|
|
// Use a template that doesn't take parameters.
|
|
http.Handle("/", templ.Handler(home()))
|
|
|
|
// Use a template that accesses data or handles form posts.
|
|
http.Handle("/posts", NewPostsHandler())
|
|
|
|
// Start the server.
|
|
fmt.Println("listening on http://localhost:8000")
|
|
if err := http.ListenAndServe("localhost:8000", nil); err != nil {
|
|
log.Printf("error listening: %v", err)
|
|
}
|
|
}
|
|
|
|
func NewPostsHandler() PostsHandler {
|
|
// Replace this in-memory function with a call to a database.
|
|
postsGetter := func() (posts []Post, err error) {
|
|
return []Post{{Name: "templ", Author: "author"}}, nil
|
|
}
|
|
return PostsHandler{
|
|
GetPosts: postsGetter,
|
|
Log: log.Default(),
|
|
}
|
|
}
|
|
|
|
type PostsHandler struct {
|
|
Log *log.Logger
|
|
GetPosts func() ([]Post, error)
|
|
}
|
|
|
|
func (ph PostsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
ps, err := ph.GetPosts()
|
|
if err != nil {
|
|
ph.Log.Printf("failed to get posts: %v", err)
|
|
http.Error(w, "failed to retrieve posts", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
templ.Handler(posts(ps)).ServeHTTP(w, r)
|
|
}
|
|
|
|
type Post struct {
|
|
Name string
|
|
Author string
|
|
}
|