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  }