aboutsummaryrefslogtreecommitdiff
path: root/app/router.go
diff options
context:
space:
mode:
authorjet2tlf <jet2tlf@gmail.com>2024-06-03 16:48:36 +0000
committerjet2tlf <jet2tlf@gmail.com>2024-06-03 16:48:36 +0000
commitb3dd001bc8cc282c75105ba229e0c55e5a4b3252 (patch)
tree1351303952ba7ee16a494db4c069d38747bf3528 /app/router.go
parent8a94110728cca144388958d4bd322045f8bfb9e4 (diff)
downloadhttp-server-go-b3dd001bc8cc282c75105ba229e0c55e5a4b3252.tar.gz
http-server-go-b3dd001bc8cc282c75105ba229e0c55e5a4b3252.zip
codecrafters submit [skip ci]
Diffstat (limited to 'app/router.go')
-rw-r--r--app/router.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/app/router.go b/app/router.go
new file mode 100644
index 0000000..4f563d7
--- /dev/null
+++ b/app/router.go
@@ -0,0 +1,82 @@
+package main
+
+import (
+ "bufio"
+ "io"
+ "net"
+ "regexp"
+)
+
+type Router struct {
+ routes []Route
+}
+
+func (r *Router) handler(request *Request) func(*Request) *Response {
+ for _, route := range r.routes {
+ if route.method == request.Method() && route.path.MatchString(request.Target()) {
+ return route.handler
+ }
+ }
+
+ return func(request *Request) *Response {
+ return NewResponse(NotFound, nil, nil)
+ }
+}
+
+func (r *Router) write(writer io.Writer, response *Response) (err error) {
+ _, err = writer.Write(response.StatusLine())
+ if err != nil {
+ return
+ }
+
+ _, err = writer.Write(response.Headers())
+ if err != nil {
+ return
+ }
+
+ _, err = writer.Write(response.Body())
+ if err != nil {
+ return
+ }
+
+ return
+}
+
+func (r *Router) Handle(conn net.Conn) error {
+ request, err := NewRequest(bufio.NewReader(conn))
+ if err != nil {
+ return err
+ }
+
+ return r.write(conn, r.handler(request)(request))
+}
+
+type Route struct {
+ method string
+ path *regexp.Regexp
+ handler func(*Request) *Response
+}
+
+type RouterBuilder struct {
+ routes []Route
+}
+
+func (r *RouterBuilder) Add(method string, path *regexp.Regexp, handler func(*Request) *Response) {
+ r.routes = append(r.routes, Route{
+ method: method,
+ path: path,
+ handler: handler,
+ })
+}
+
+func (r *RouterBuilder) Build() *Router {
+ return &Router{
+ routes: r.routes,
+ }
+}
+
+func NewRouterBuilder() *RouterBuilder {
+ return &RouterBuilder{
+ routes: make([]Route, 0),
+ }
+}