github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/grifts.go (about) 1 package buffalo 2 3 import ( 4 "crypto/rand" 5 "fmt" 6 "os" 7 "strings" 8 "text/tabwriter" 9 10 "github.com/markbates/grift/grift" 11 ) 12 13 // Grifts decorates the app with tasks 14 func Grifts(app *App) { 15 routesGrift(app) 16 middlewareGrift(app) 17 secretGrift() 18 } 19 20 func secretGrift() { 21 grift.Desc("secret", "Generate a cryptographically secure secret key") 22 grift.Add("secret", func(c *grift.Context) error { 23 b := make([]byte, 64) 24 _, err := rand.Read(b) 25 if err != nil { 26 return err 27 } 28 fmt.Println(string(b)) 29 return nil 30 }) 31 } 32 33 func middlewareGrift(a *App) { 34 grift.Desc("middleware", "Prints out your middleware stack") 35 grift.Add("middleware", func(c *grift.Context) error { 36 printMiddleware(a) 37 return nil 38 }) 39 } 40 41 func printMiddleware(a *App) { 42 printMiddlewareByRoute(a) 43 } 44 45 func printMiddlewareByRoute(a *App) { 46 mws := map[string]string{} 47 for _, r := range a.Routes() { 48 if mws[r.App.Name] == "" { 49 pname := "" 50 if parent := getParentApp(r.App.root, r.App.Name); parent != nil { 51 pname = parent.Name 52 } 53 54 mws[r.App.Name] = r.App.Middleware.String() 55 if mws[pname] != mws[r.App.Name] { 56 fmt.Printf("-> %s\n", r.App.Name) 57 printMiddlewareStackWithIndent(mws[r.App.Name]) 58 } else { 59 fmt.Printf("-> %s (see: %v)\n", r.App.Name, pname) 60 } 61 } 62 s := "\n" + mws[r.App.Name] 63 for k := range r.App.Middleware.skips { 64 mw := strings.Split(k, funcKeyDelimeter)[0] 65 h := strings.Split(k, funcKeyDelimeter)[1] 66 if h == r.HandlerName { 67 s = strings.Replace(s, "\n"+mw, "", 1) 68 } 69 } 70 if "\n"+mws[r.App.Name] != s { 71 ahn := strings.Split(r.HandlerName, "/") 72 hn := ahn[len(ahn)-1] 73 fmt.Printf("-> %s %s (by %s)\n", r.Method, r.Path, hn) 74 printMiddlewareStackWithIndent(s) 75 } 76 } 77 } 78 79 func getParentApp(r *App, name string) *App { 80 if r == nil { 81 return nil 82 } 83 for _, x := range r.children { 84 if x.Name == name { 85 return r 86 } 87 if len(x.children) > 0 { 88 if ret := getParentApp(x, name); ret != nil { 89 return ret 90 } 91 } 92 } 93 return nil 94 } 95 96 func printMiddlewareStackWithIndent(s string) { 97 if s == "" { 98 s = "[none]" 99 } 100 s = strings.Replace(s, "\n", "\n\t", -1) 101 fmt.Printf("\t%v\n", strings.TrimSpace(s)) 102 } 103 104 func routesGrift(a *App) { 105 grift.Desc("routes", "Print out all defined routes") 106 grift.Add("routes", func(c *grift.Context) error { 107 routes := a.Routes() 108 w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.Debug) 109 fmt.Fprintln(w, "METHOD\t PATH\t ALIASES\t NAME\t HANDLER") 110 fmt.Fprintln(w, "------\t ----\t -------\t ----\t -------") 111 for _, r := range routes { 112 fmt.Fprintf(w, "%s\t %s\t %s\t %s\t %s\n", r.Method, r.Path, strings.Join(r.Aliases, " "), r.PathName, r.HandlerName) 113 } 114 w.Flush() 115 return nil 116 }) 117 }