| 
															 | 
															 | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															package rex | 
															 | 
															 | 
															package rex | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															import ( | 
															 | 
															 | 
															import ( | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																"flag" | 
														
														
													
														
															 | 
															 | 
																"net/http" | 
															 | 
															 | 
																"net/http" | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																"path/filepath" | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																"runtime" | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																"github.com/goanywhere/rex/internal" | 
														
														
													
														
															 | 
															 | 
																"github.com/goanywhere/rex/modules" | 
															 | 
															 | 
																"github.com/goanywhere/rex/modules" | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																"github.com/goanywhere/x/env" | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																"github.com/goanywhere/x/fs" | 
														
														
													
														
															 | 
															 | 
															) | 
															 | 
															 | 
															) | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															var DefaultMux = New() | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															var ( | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux = New() | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																options = struct { | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																	debug    bool | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																	port     int | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																	maxprocs int | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																}{ | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																	debug:    true, | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																	port:     5000, | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																	maxprocs: runtime.NumCPU(), | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																} | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															) | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Get is a shortcut for mux.HandleFunc(pattern, handler).Methods("GET"), | 
															 | 
															 | 
															// Get is a shortcut for mux.HandleFunc(pattern, handler).Methods("GET"), | 
														
														
													
														
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
														
														
													
														
															 | 
															 | 
															func Get(pattern string, handler interface{}) { | 
															 | 
															 | 
															func Get(pattern string, handler interface{}) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.register("GET", pattern, handler) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.register("GET", pattern, handler) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Head is a shortcut for mux.HandleFunc(pattern, handler).Methods("HEAD") | 
															 | 
															 | 
															// Head is a shortcut for mux.HandleFunc(pattern, handler).Methods("HEAD") | 
														
														
													
														
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
														
														
													
														
															 | 
															 | 
															func Head(pattern string, handler interface{}) { | 
															 | 
															 | 
															func Head(pattern string, handler interface{}) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.register("HEAD", pattern, handler) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.register("HEAD", pattern, handler) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Options is a shortcut for mux.HandleFunc(pattern, handler).Methods("OPTIONS") | 
															 | 
															 | 
															// Options is a shortcut for mux.HandleFunc(pattern, handler).Methods("OPTIONS") | 
														
														
													
														
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
														
														
													
														
															 | 
															 | 
															// NOTE method OPTIONS is **NOT** cachable, beware of what you are going to do. | 
															 | 
															 | 
															// NOTE method OPTIONS is **NOT** cachable, beware of what you are going to do. | 
														
														
													
														
															 | 
															 | 
															func Options(pattern string, handler interface{}) { | 
															 | 
															 | 
															func Options(pattern string, handler interface{}) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.register("OPTIONS", pattern, handler) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.register("OPTIONS", pattern, handler) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Post is a shortcut for mux.HandleFunc(pattern, handler).Methods("POST") | 
															 | 
															 | 
															// Post is a shortcut for mux.HandleFunc(pattern, handler).Methods("POST") | 
														
														
													
														
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
														
														
													
														
															 | 
															 | 
															func Post(pattern string, handler interface{}) { | 
															 | 
															 | 
															func Post(pattern string, handler interface{}) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.register("POST", pattern, handler) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.register("POST", pattern, handler) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Put is a shortcut for mux.HandleFunc(pattern, handler).Methods("PUT") | 
															 | 
															 | 
															// Put is a shortcut for mux.HandleFunc(pattern, handler).Methods("PUT") | 
														
														
													
														
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
														
														
													
														
															 | 
															 | 
															func Put(pattern string, handler interface{}) { | 
															 | 
															 | 
															func Put(pattern string, handler interface{}) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.register("PUT", pattern, handler) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.register("PUT", pattern, handler) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Delete is a shortcut for mux.HandleFunc(pattern, handler).Methods("DELETE") | 
															 | 
															 | 
															// Delete is a shortcut for mux.HandleFunc(pattern, handler).Methods("DELETE") | 
														
														
													
														
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
															 | 
															 | 
															// it also fetch the full function name of the handler (with package) to name the route. | 
														
														
													
														
															 | 
															 | 
															func Delete(pattern string, handler interface{}) { | 
															 | 
															 | 
															func Delete(pattern string, handler interface{}) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.register("Delete", pattern, handler) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.register("Delete", pattern, handler) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Group creates a new application group under the given path. | 
															 | 
															 | 
															// Group creates a new application group under the given path. | 
														
														
													
														
															 | 
															 | 
															func Group(path string) *Router { | 
															 | 
															 | 
															func Group(path string) *Router { | 
														
														
													
														
															 | 
															 | 
																return DefaultMux.Group(path) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																return mux.Group(path) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// FileServer registers a handler to serve HTTP requests | 
															 | 
															 | 
															// FileServer registers a handler to serve HTTP requests | 
														
														
													
														
															 | 
															 | 
															// with the contents of the file system rooted at root. | 
															 | 
															 | 
															// with the contents of the file system rooted at root. | 
														
														
													
														
															 | 
															 | 
															func FileServer(prefix, dir string) { | 
															 | 
															 | 
															func FileServer(prefix, dir string) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.FileServer(prefix, dir) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.FileServer(prefix, dir) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															// Use appends middleware module into the serving list, modules will be served in FIFO order. | 
															 | 
															 | 
															// Use appends middleware module into the serving list, modules will be served in FIFO order. | 
														
														
													
														
															 | 
															 | 
															func Use(module func(http.Handler) http.Handler) { | 
															 | 
															 | 
															func Use(module func(http.Handler) http.Handler) { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.Use(module) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.Use(module) | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															
  | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															func Run() { | 
															 | 
															 | 
															func Run() { | 
														
														
													
														
															 | 
															 | 
																DefaultMux.Use(modules.Logger) | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
																DefaultMux.Run() | 
															 | 
															 | 
															 | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.Use(modules.Logger) | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																mux.Run() | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															} | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															func init() { | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																// ---------------------------------------- | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																// Project Root | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																// ---------------------------------------- | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																var root = fs.Getcd(2) | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																env.Set(internal.Root, root) | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																env.Load(filepath.Join(root, ".env")) | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																// cmd arguments | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																flag.BoolVar(&options.debug, "debug", options.debug, "flag to toggle debug mode") | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																flag.IntVar(&options.port, "port", options.port, "port to run the application server") | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																flag.IntVar(&options.maxprocs, "maxprocs", options.maxprocs, "maximum cpu processes to run the server") | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
															
  | 
														
														
													
														
															 | 
															 | 
															 | 
															 | 
															 | 
																flag.Parse() | 
														
														
													
														
															 | 
															 | 
															} | 
															 | 
															 | 
															} |