package main import ( // External "git.ahall.se/go/html_template" // Standard "encoding/json" "fmt" "io/fs" "net/http" "strconv" ) var ( engine HTMLTemplate.Engine ) func initWebserver() (err error) { address := fmt.Sprintf("%s:%d", config.Network.Address, config.Network.Port) logger.Info("webserver", "listen", address) subViewFS, _ := fs.Sub(viewFS, "views") subStaticFS, _ := fs.Sub(staticFS, "static") engine, err = HTMLTemplate.NewEngine(subViewFS, subStaticFS, flagDev) if err != nil { return } http.HandleFunc("/", pageIndex) http.HandleFunc("/app", pageApp) http.HandleFunc("/nodes/tree/{startNode}", actionNodesTree) err = http.ListenAndServe(address, nil) return } func pageIndex(w http.ResponseWriter, r *http.Request) { // {{{ if r.URL.Path == "/" { http.Redirect(w, r, "/app", http.StatusSeeOther) } else { engine.StaticResource(w, r) } } // }}} func pageApp(w http.ResponseWriter, r *http.Request) { // {{{ page := NewPage("app") err := engine.Render(page, w, r) if err != nil { w.Write([]byte(err.Error())) } } // }}} func actionNodesTree(w http.ResponseWriter, r *http.Request) { // {{{ var err error startNode := 0 startNodeStr := r.PathValue("startNode") startNode, _ = strconv.Atoi(startNodeStr) var maxDepth int if maxDepth, err = strconv.Atoi(r.URL.Query().Get("depth")); err != nil { maxDepth = 3 } topNode, err := GetNode(startNode, maxDepth) if err != nil { logger.Error("test", "error", err) } j, _ := json.Marshal(topNode) w.Write(j) } // }}}