github.com/adharshmk96/stk@v1.2.3/pkg/project/boilerplate.go (about) 1 package project 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "path/filepath" 8 "strings" 9 "text/template" 10 11 "github.com/adharshmk96/stk/pkg/project/tpl" 12 ) 13 14 const DEFAULT_MODULE = "ping" 15 const MODULE_PLACEHOLDER = "ping" 16 const MODULE_PLACEHOLDER_UPPER = "Ping" 17 18 func GenerateProjectBoilerplate(ctx *Context) error { 19 if !ctx.IsGitRepo { 20 fmt.Println("initializing git repository...") 21 err := ctx.GitCmd.Init() 22 if err != nil { 23 return err 24 } 25 } 26 27 if !ctx.IsGoModule { 28 fmt.Println("initializing go module...") 29 err := ctx.GoCmd.ModInit(ctx.PackageName) 30 if err != nil { 31 return err 32 } 33 } 34 35 fmt.Println("generating project files...") 36 templateConfig := GetTemplateConfig(ctx, DEFAULT_MODULE) 37 err := generateBoilerplate(tpl.ProjectTemplates, templateConfig) 38 if err != nil { 39 return err 40 } 41 42 err = generateBoilerplate(tpl.ModuleTemplates, templateConfig) 43 if err != nil { 44 return err 45 } 46 47 fmt.Println("running go mod tidy...") 48 err = ctx.GoCmd.ModTidy() 49 if err != nil { 50 return err 51 } 52 53 return nil 54 } 55 56 func GenerateModuleBoilerplate(ctx *Context, module string) error { 57 fmt.Println("generating module files...") 58 templateConfig := GetTemplateConfig(ctx, module) 59 return generateBoilerplate(tpl.ModuleTemplates, templateConfig) 60 } 61 62 func DeleteModuleBoilerplate(ctx *Context, module string) error { 63 fmt.Println("deleting module files...") 64 templateConfig := GetTemplateConfig(ctx, module) 65 return deleteBoilerplate(tpl.ModuleTemplates, templateConfig) 66 } 67 68 func generateBoilerplate(templates []tpl.Template, config *TemplateConfig) error { 69 for _, tf := range templates { 70 tf.FilePath = formatModuleFilePath(tf.FilePath, config) 71 72 if err := createDirectoryForFile(tf.FilePath); err != nil { 73 return err 74 } 75 76 if tf.Render { 77 if err := createAndExecuteTemplate(tf, config); err != nil { 78 return err 79 } 80 } else { 81 if err := os.WriteFile(tf.FilePath, []byte(tf.Content), 0644); err != nil { 82 return err 83 } 84 } 85 86 } 87 return nil 88 } 89 90 func deleteBoilerplate(templates []tpl.Template, config *TemplateConfig) error { 91 for _, tf := range templates { 92 tf.FilePath = formatModuleFilePath(tf.FilePath, config) 93 94 dir := filepath.Dir(tf.FilePath) 95 if strings.Contains(dir, config.ModName) { 96 err := os.RemoveAll(dir) 97 if err != nil { 98 return err 99 } 100 continue 101 } 102 103 err := os.Remove(tf.FilePath) 104 if err != nil { 105 return err 106 } 107 } 108 109 return nil 110 } 111 112 func formatModuleFilePath(pathTemplate string, config *TemplateConfig) string { 113 modname := strings.ReplaceAll(pathTemplate, MODULE_PLACEHOLDER, config.ModName) 114 modname = strings.ReplaceAll(modname, MODULE_PLACEHOLDER_UPPER, config.ExportedName) 115 return modname 116 } 117 118 func createDirectoryForFile(path string) error { 119 dir := filepath.Dir(path) 120 err := os.MkdirAll(dir, 0755) 121 if err != nil { 122 log.Fatalf("failed to create directory for file %s: %v\n", path, err) 123 } 124 return err 125 } 126 127 func createAndExecuteTemplate(tf tpl.Template, config *TemplateConfig) error { 128 f, err := os.Create(tf.FilePath) 129 if err != nil { 130 log.Fatalf("Failed to create file %s: %v\n", tf.FilePath, err) 131 return err 132 } 133 defer f.Close() 134 135 tpl := template.Must(template.New(tf.FilePath).Parse(tf.Content)) 136 err = tpl.Execute(f, config) 137 if err != nil { 138 log.Fatalf("Failed to execute template for file %s: %v\n", tf.FilePath, err) 139 } 140 return err 141 }