package framework import ( "log" "net/http" "strings" ) // Core is the core struct of the framework type Core struct { router map[string]*Trie } // NewCore initialize the Core. func NewCore() *Core { getRouter := NewTrie() postRouter := NewTrie() putRouter := NewTrie() deleteRouter := NewTrie() router := map[string]*Trie{} router["GET"] = getRouter router["POST"] = postRouter router["PUT"] = putRouter router["DELETE"] = deleteRouter return &Core{router: router} } // Get is a simple get router func (c *Core) Get(url string, handler ControllerHandler) { upperUrl := strings.ToUpper(url) if err := c.router["GET"].AddRouter(upperUrl, handler); err != nil { log.Println(err) } } // Post is a simple post router func (c *Core) Post(url string, handler ControllerHandler) { upperUrl := strings.ToUpper(url) if err := c.router["POST"].AddRouter(upperUrl, handler); err != nil { log.Println(err) } } // Put is a simple put router func (c *Core) Put(url string, handler ControllerHandler) { upperUrl := strings.ToUpper(url) if err := c.router["PUT"].AddRouter(upperUrl, handler); err != nil { log.Println(err) } } // Delete is a simple delete router func (c *Core) Delete(url string, handler ControllerHandler) { upperUrl := strings.ToUpper(url) if err := c.router["DELETE"].AddRouter(upperUrl, handler); err != nil { log.Println(err) } } // FindRouteByRequest finds route using the request func (c *Core) FindRouteByRequest(r *http.Request) ControllerHandler { upperUri := strings.ToUpper(r.URL.Path) upperMethod := strings.ToUpper(r.Method) mapper, ok := c.router[upperMethod] if !ok { log.Printf("Method %q is not recognized\n", upperMethod) return nil } controller := mapper.FindRoute(upperUri) if controller == nil { log.Printf("URI %q is not recognized\n", r.URL.Path) return nil } return controller } func (c *Core) Group(prefix string) IGroup { return &Group{ core: c, prefix: prefix, } } // ServeHTTP implements the Handler interface func (c *Core) ServeHTTP(w http.ResponseWriter, r *http.Request) { log.Println("Welcome to the Araneae framework") ctx := NewContext(w, r) router := c.FindRouteByRequest(r) if router == nil { ctx.WriteJSON(http.StatusNotFound, "Request not found") return } err := router(ctx) if err != nil { ctx.WriteJSON(http.StatusInternalServerError, "Internal error") return } }