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  }