diff --git a/rest/engine.go b/rest/engine.go index 53d536a4..fad45771 100644 --- a/rest/engine.go +++ b/rest/engine.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/http" + "sort" "time" "github.com/justinas/alice" @@ -184,6 +185,22 @@ func (ng *engine) notFoundHandler(next http.Handler) http.Handler { }) } +func (ng *engine) print() { + var routes []string + + for _, fr := range ng.routes { + for _, route := range fr.routes { + routes = append(routes, fmt.Sprintf("%s %s", route.Method, route.Path)) + } + } + + sort.Strings(routes) + + for _, route := range routes { + fmt.Println(route) + } +} + func (ng *engine) setTlsConfig(cfg *tls.Config) { ng.tlsConfig = cfg } diff --git a/rest/server.go b/rest/server.go index 669f7084..51a4dbc0 100644 --- a/rest/server.go +++ b/rest/server.go @@ -73,6 +73,11 @@ func (s *Server) AddRoute(r Route, opts ...RouteOption) { s.AddRoutes([]Route{r}, opts...) } +// PrintRoutes prints the added routes to stdout. +func (s *Server) PrintRoutes() { + s.ngin.print() +} + // Start starts the Server. // Graceful shutdown is enabled by default. // Use proc.SetTimeToForceQuit to customize the graceful shutdown period. diff --git a/rest/server_test.go b/rest/server_test.go index 7f0c667e..06dd6d13 100644 --- a/rest/server_test.go +++ b/rest/server_test.go @@ -7,6 +7,8 @@ import ( "io/ioutil" "net/http" "net/http/httptest" + "os" + "strings" "testing" "time" @@ -341,3 +343,67 @@ Port: 54321 }, "local") opt(svr) } + +func TestServer_PrintRoutes(t *testing.T) { + const ( + configYaml = ` +Name: foo +Port: 54321 +` + expect = `GET /bar +GET /foo +GET /foo/:bar +GET /foo/:bar/baz +` + ) + + var cnf RestConf + assert.Nil(t, conf.LoadFromYamlBytes([]byte(configYaml), &cnf)) + + svr, err := NewServer(cnf) + assert.Nil(t, err) + + svr.AddRoutes([]Route{ + { + Method: http.MethodGet, + Path: "/foo", + Handler: http.NotFound, + }, + { + Method: http.MethodGet, + Path: "/bar", + Handler: http.NotFound, + }, + { + Method: http.MethodGet, + Path: "/foo/:bar", + Handler: http.NotFound, + }, + { + Method: http.MethodGet, + Path: "/foo/:bar/baz", + Handler: http.NotFound, + }, + }) + + old := os.Stdout + r, w, err := os.Pipe() + assert.Nil(t, err) + os.Stdout = w + defer func() { + os.Stdout = old + }() + + svr.PrintRoutes() + ch := make(chan string) + + go func() { + var buf strings.Builder + io.Copy(&buf, r) + ch <- buf.String() + }() + + w.Close() + out := <-ch + assert.Equal(t, expect, out) +}