diff --git a/cmd/serve/main.go b/cmd/serve/main.go new file mode 100644 index 0000000..dc87cf5 --- /dev/null +++ b/cmd/serve/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "flag" + "os" + "strconv" + + comicverse "forge.capytal.company/capytalcode/project-comicverse" +) + +var port *int + +func init() { + portEnv := os.Getenv("COMICVERSE_PORT") + if portEnv == "" { + portEnv = "8080" + } + p, err := strconv.Atoi(portEnv) + if err != nil { + p = 8080 + } + + port = flag.Int("port", p, "The port to the server to listen on") +} + +func main() { + flag.Parse() + comicverse.Run(*port) +} diff --git a/comicverse.go b/comicverse.go new file mode 100644 index 0000000..cad888a --- /dev/null +++ b/comicverse.go @@ -0,0 +1,20 @@ +package comicverse + +import ( + "fmt" + "log" + "net/http" + + "forge.capytal.company/capytalcode/project-comicverse/pages" + "forge.capytal.company/capytalcode/project-comicverse/router" +) + +func Run(port int) { + router := router.NewRouter() + + router.HandleRoutes(pages.PAGES) + + if err := http.ListenAndServe(fmt.Sprintf(":%v", port), router); err != nil { + log.Fatal(err) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9dc3e01 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module forge.capytal.company/capytalcode/project-comicverse + +go 1.22.7 diff --git a/pages/dashboard.templ b/pages/dashboard.templ new file mode 100644 index 0000000..285e903 --- /dev/null +++ b/pages/dashboard.templ @@ -0,0 +1,10 @@ +package pages + +type Dashboard struct {} + +func (p *Dashboard) ServeHTTP() { +} + +templ (p *Dashboard) Component() { + +} diff --git a/pages/routes.go b/pages/routes.go new file mode 100644 index 0000000..63a22b3 --- /dev/null +++ b/pages/routes.go @@ -0,0 +1,7 @@ +package pages + +import ( + "forge.capytal.company/capytalcode/project-comicverse/router" +) + +var PAGES = []router.Route{} diff --git a/router/default.go b/router/default.go new file mode 100644 index 0000000..e8e4d0f --- /dev/null +++ b/router/default.go @@ -0,0 +1,29 @@ +package router + +import ( + "net/http" + + "forge.capytal.company/capytalcode/project-comicverse/router/middleware" +) + +var DefaultRouter = NewRouter() + +func Handle(pattern string, handler http.Handler) { + DefaultRouter.Handle(pattern, handler) +} + +func HandleFunc(pattern string, handler http.HandlerFunc) { + DefaultRouter.HandleFunc(pattern, handler) +} + +func HandleRoutes(routes []Route) { + DefaultRouter.HandleRoutes(routes) +} + +func Middleware(m middleware.Middleware) { + DefaultRouter.AddMiddleware(m) +} + +func ServeHTTP(w http.ResponseWriter, r *http.Request) { + DefaultRouter.ServeHTTP(w, r) +} diff --git a/router/router.go b/router/router.go new file mode 100644 index 0000000..393bea3 --- /dev/null +++ b/router/router.go @@ -0,0 +1,54 @@ +package router + +import ( + "fmt" + "net/http" +) + +type Router struct { + mux *http.ServeMux + serveHttp http.HandlerFunc +} + +type RouterOpts struct { + Mux *http.ServeMux +} + +type Route struct { + pattern string + handler http.Handler +} + +func NewRouter(opts ...RouterOpts) *Router { + var mux *http.ServeMux + if len(opts) > 0 { + mux = opts[0].Mux + } else { + mux = http.NewServeMux() + } + + return &Router{ + mux: mux, + serveHttp: mux.ServeHTTP, + middlewares: []middleware.Middleware{}, + } +} + +func (r *Router) Handle(pattern string, handler http.Handler) { + r.mux.Handle(pattern, handler) +} + +func (r *Router) HandleFunc(pattern string, hf http.HandlerFunc) { + r.mux.HandleFunc(pattern, hf) +} + +func (rt *Router) HandleRoutes(routes []Route) { + for _, r := range routes { + rt.Handle(r.pattern, r.handler) + } +} + +func (rt *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) { + rt.serveHttp(w, r) +} +