59 lines
1.1 KiB
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)
|
|
}
|