github.com/soypat/vectytemplater@v0.0.0-20220501050640-d40b24e35168/main.go (about)

     1  package main
     2  
     3  import (
     4  	"embed"
     5  	"errors"
     6  	"flag"
     7  	"fmt"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  
    12  	"github.com/soypat/rebed"
    13  )
    14  
    15  var (
    16  	//go:embed _templates/default
    17  	defaultFS embed.FS
    18  
    19  	//go:embed _templates/websocket-cli
    20  	websocketFS embed.FS
    21  )
    22  
    23  func main() {
    24  	if err := run(os.Args[1:]); err != nil {
    25  		fmt.Fprintln(os.Stderr, "error in run:", err)
    26  		os.Exit(1)
    27  	}
    28  	fmt.Fprintln(os.Stdout, "finished succesfully")
    29  }
    30  
    31  func run(args []string) (err error) {
    32  	if len(args) == 0 || args[0] == "-h" || args[0] == "--help" || args[0] == "-help" {
    33  		usage("")
    34  		return errors.New("showing help for vecty templater")
    35  	}
    36  	template := flag.String("template", "default", "template name. \"default\" or \"websocket\"")
    37  	err = flag.CommandLine.Parse(args[1:])
    38  	if err != nil {
    39  		return err
    40  	}
    41  	workDir, err := os.Getwd()
    42  	if err != nil {
    43  		return err
    44  	}
    45  	dir := args[0]
    46  	targetDir := filepath.Join(workDir, dir)
    47  	if _, err := os.Stat(targetDir); err == nil {
    48  		usage("")
    49  		return errors.New("cannot create directory \"" + dir + "\" as it already exists")
    50  	}
    51  
    52  	tempDir := os.TempDir()
    53  	if tempDir == "" {
    54  		return errors.New("unable to create temporary directory")
    55  	}
    56  	err = os.Chdir(tempDir)
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	const perm os.FileMode = 0777
    62  	rebed.FolderMode = perm
    63  	// removes existing template write if present.
    64  	if err = os.RemoveAll(filepath.Join(tempDir, "_templates")); err != nil {
    65  		return err
    66  	}
    67  	switch *template {
    68  	case "default":
    69  		err = rebed.Create(defaultFS, ".")
    70  	case "websocket-cli":
    71  		err = rebed.Create(websocketFS, ".")
    72  	default:
    73  		err = errors.New("template " + *template + " not found")
    74  	}
    75  	if err != nil {
    76  		return errors.New("creating temporary project structure: " + err.Error())
    77  	}
    78  	tmpOutput := filepath.Join(tempDir, "_templates", *template)
    79  	fp, err := os.Create(filepath.Join(tmpOutput, "go.mod"))
    80  	if err != nil {
    81  		return err
    82  	}
    83  	fp.WriteString(gomod)
    84  	cmd := exec.Command("go", "mod", "tidy")
    85  	cmd.Env = append(os.Environ(), "GOOS=js", "GOARCH=wasm", "GO111MODULE=on")
    86  	cmd.Dir = tmpOutput
    87  	fmt.Fprintln(os.Stdout, "running `go mod tidy`")
    88  	out, err := cmd.CombinedOutput()
    89  	if err != nil {
    90  		return errors.New("project created but failed to initialize module: " + err.Error() + "\n" + string(out))
    91  	}
    92  	fmt.Fprint(os.Stdout, string(out))
    93  	err = os.Rename(tmpOutput, targetDir)
    94  	if err != nil {
    95  		return err
    96  	}
    97  	return nil
    98  }
    99  
   100  func usage(command string) {
   101  	fmt.Fprintf(os.Stderr, "vectytemplater usage: %s <output> [-template=<name>]\n", os.Args[0])
   102  	fmt.Fprintln(os.Stderr, "flags:")
   103  	fmt.Fprintln(os.Stderr, "    template  template name. Available: [\"default\", \"websocket\"]")
   104  }
   105  
   106  const gomod = `module vecty-templater-project
   107  ` // No version info so `go mod tidy` sets own version