73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package ui
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
"path/filepath"
|
|
|
|
"github.com/Masterminds/sprig"
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"nano-run/server"
|
|
)
|
|
|
|
func Expose(units []server.Unit, uiDir string) http.Handler {
|
|
router := gin.New()
|
|
Attach(router, units, uiDir)
|
|
return router
|
|
}
|
|
|
|
func Attach(router gin.IRouter, units []server.Unit, uiDir string) {
|
|
ui := &uiRouter{
|
|
dir: uiDir,
|
|
units: units,
|
|
}
|
|
router.GET("/units", ui.listUnits)
|
|
router.GET("/unit/:name", ui.unitInfo)
|
|
}
|
|
|
|
type uiRouter struct {
|
|
dir string
|
|
units []server.Unit
|
|
}
|
|
|
|
func (ui *uiRouter) unitInfo(gctx *gin.Context) {
|
|
name := gctx.Param("name")
|
|
var unit *server.Unit
|
|
for _, u := range ui.units {
|
|
if u.Name() == name {
|
|
unit = &u
|
|
break
|
|
}
|
|
}
|
|
if unit == nil {
|
|
gctx.AbortWithStatus(http.StatusNotFound)
|
|
return
|
|
}
|
|
var reply struct {
|
|
Unit *server.Unit
|
|
}
|
|
reply.Unit = unit
|
|
gctx.HTML(http.StatusOK, "unit-info.html", reply)
|
|
}
|
|
|
|
func (ui *uiRouter) listUnits(gctx *gin.Context) {
|
|
var reply struct {
|
|
Units []server.Unit
|
|
}
|
|
reply.Units = ui.units
|
|
gctx.HTML(http.StatusOK, "units-list.html", reply)
|
|
}
|
|
|
|
func (ui *uiRouter) getTemplate(name string) *template.Template {
|
|
t, err := template.New("").Funcs(sprig.HtmlFuncMap()).ParseFiles(filepath.Join(ui.dir, name))
|
|
if err == nil {
|
|
return t
|
|
}
|
|
t, err = template.New("").Parse("<html><body>Ooops... Page not found</body></html>")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return t
|
|
}
|