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