81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
package server
|
|
|
|
import (
|
|
"fes/modules/ui"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
/* performs relavent handling based on the directory passaed
|
|
*
|
|
* Special directories
|
|
* - www/ <= contains lua routes.
|
|
* - static/ <= static content accessable at /static/path or /static/dir/path.
|
|
* - include/ <= globally accessable lua functions, cannot directly access "fes" right now.
|
|
* - archive/ <= contains user facing files such as archives or dists.
|
|
*
|
|
*/
|
|
func handleDir(entries []os.DirEntry, dir string, routes map[string]string, base string, isStatic bool) error {
|
|
for _, entry := range entries {
|
|
path := filepath.Join(dir, entry.Name())
|
|
if entry.IsDir() {
|
|
nextBase := joinBase(base, entry.Name())
|
|
subEntries, err := os.ReadDir(path)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read directory %s: %w", path, err)
|
|
}
|
|
if err := handleDir(subEntries, path, routes, nextBase, isStatic); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
route := joinBase(base, entry.Name())
|
|
if !isStatic && strings.HasSuffix(entry.Name(), ".lua") {
|
|
name := strings.TrimSuffix(entry.Name(), ".lua")
|
|
if name == "index" {
|
|
routes[basePath(base)] = path
|
|
routes[route] = path
|
|
continue
|
|
}
|
|
route = joinBase(base, name)
|
|
} else if !isStatic && strings.HasSuffix(entry.Name(), ".md") {
|
|
name := strings.TrimSuffix(entry.Name(), ".md")
|
|
if name == "index" {
|
|
routes[basePath(base)] = path
|
|
routes[route] = path
|
|
continue
|
|
}
|
|
route = joinBase(base, name)
|
|
}
|
|
routes[route] = path
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/* helper to load all special directories */
|
|
func loadDirs() map[string]string {
|
|
routes := make(map[string]string)
|
|
|
|
if entries, err := os.ReadDir("www"); err == nil {
|
|
if err := handleDir(entries, "www", routes, "", false); err != nil {
|
|
ui.Warning("failed to handle www directory", err)
|
|
}
|
|
}
|
|
|
|
if entries, err := os.ReadDir("static"); err == nil {
|
|
if err := handleDir(entries, "static", routes, "/static", true); err != nil {
|
|
ui.Warning("failed to handle static directory", err)
|
|
}
|
|
}
|
|
|
|
if entries, err := os.ReadDir("archive"); err == nil {
|
|
if err := handleDir(entries, "archive", routes, "/archive", true); err != nil {
|
|
ui.Warning("failed to handle archive directory", err)
|
|
}
|
|
}
|
|
|
|
return routes
|
|
}
|