cs-midi-docs/internal/server/server.go

59 lines
1.1 KiB
Go

package server
import (
"log"
"net/http"
"git.else-if.org/jess/cs-midi-docs/internal/config"
"git.else-if.org/jess/cs-midi-docs/internal/content"
"git.else-if.org/jess/cs-midi-docs/internal/render"
"git.else-if.org/jess/cs-midi-docs/internal/search"
)
type Server struct {
cfg *config.Config
watcher *content.Watcher
cache *render.Cache
index *search.Index
tmpl *Templates
}
func New(cfg *config.Config) (*Server, error) {
w, err := content.NewWatcher(cfg.ContentDir)
if err != nil {
return nil, err
}
idx := search.NewIndex()
idx.Build(w.Tree())
cache := render.NewCache()
w.OnChange(func() {
cache.Clear()
idx.Build(w.Tree())
log.Println("content reloaded")
})
w.Start()
tmpl, err := LoadTemplates()
if err != nil {
return nil, err
}
return &Server{
cfg: cfg,
watcher: w,
cache: cache,
index: idx,
tmpl: tmpl,
}, nil
}
func (s *Server) ListenAndServe() error {
mux := http.NewServeMux()
s.routes(mux)
log.Printf("listening on %s (content: %s)", s.cfg.Listen, s.cfg.ContentDir)
return http.ListenAndServe(s.cfg.Listen, mux)
}