1package webui
 2
 3import (
 4	"net/http"
 5	"os"
 6)
 7
 8// implement a http.FileSystem that will serve a default file when the looked up
 9// file doesn't exist. Useful for Single-Page App that implement routing client
10// side, where the server has to return the root index.html file for every route.
11type fileSystemWithDefault struct {
12	http.FileSystem
13	defaultFile string
14}
15
16func (fswd *fileSystemWithDefault) Open(name string) (http.File, error) {
17	f, err := fswd.FileSystem.Open(name)
18	if os.IsNotExist(err) {
19		return fswd.FileSystem.Open(fswd.defaultFile)
20	}
21	return f, err
22}
23
24func NewHandler() http.Handler {
25	assetsHandler := &fileSystemWithDefault{
26		FileSystem:  WebUIAssets,
27		defaultFile: "index.html",
28	}
29
30	return http.FileServer(assetsHandler)
31}