| ... | ... | @@ -0,0 +1,81 @@ |
| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | 	"bytes" |
| 5 | 	"errors" |
| 6 | 	"fmt" |
| 7 | 	"log" |
| 8 | 	"os" |
| 9 | 	"path/filepath" |
| 10 | 	"strings" |
| 11 | |
| 12 | 	"github.com/nektro/go-util/util" |
| 13 | 	"github.com/spf13/cobra" |
| 14 | ) |
| 15 | |
| 16 | func init() { |
| 17 | 	last := func(a []string) string { |
| 18 | 		if len(a) == 0 { |
| 19 | 			return "" |
| 20 | 		} |
| 21 | 		return a[len(a)-1] |
| 22 | 	} |
| 23 | 	tryIndex := func(a []string, n int) string { |
| 24 | 		if n >= len(a) { |
| 25 | 			return "" |
| 26 | 		} |
| 27 | 		return a[n] |
| 28 | 	} |
| 29 | 	detectPkgName := func(arg string) string { |
| 30 | 		if len(arg) > 0 { |
| 31 | 			return arg |
| 32 | 		} |
| 33 | 		n, _ := filepath.Abs("./") |
| 34 | 		n = last(strings.Split(n, "/")) |
| 35 | 		n = strings.TrimPrefix(n, "zig-") |
| 36 | 		assert(len(n) > 0, "name may not be an empty string") |
| 37 | 		return n |
| 38 | 	} |
| 39 | 	detectMainFile := func(arg string) string { |
| 40 | 		if len(arg) > 0 { |
| 41 | 			argR, err := filepath.Abs(arg) |
| 42 | 			util.DieOnError(err) |
| 43 | 			if !util.DoesFileExist(argR) { |
| 44 | 				util.DieOnError(errors.New("specified entry point file does not exist: " + arg)) |
| 45 | 			} |
| 46 | 			if !strings.HasSuffix(arg, ".zig") { |
| 47 | 				util.DieOnError(errors.New("main entry point must be a .zig file")) |
| 48 | 			} |
| 49 | 			cwd, _ := os.Getwd() |
| 50 | 			argR = strings.TrimPrefix(argR, cwd)[1:] |
| 51 | 			argR = strings.ReplaceAll(argR, "\\", "/") |
| 52 | 			return argR |
| 53 | 		} |
| 54 | 		if util.DoesFileExist("./src/main.zig") { |
| 55 | 			return "src/main.zig" |
| 56 | 		} |
| 57 | 		util.DieOnError(errors.New("unable to determine package entry point")) |
| 58 | 		return "" |
| 59 | 	} |
| 60 | 	rootCmd.AddCommand(&cobra.Command{ |
| 61 | 		Use: "init", |
| 62 | 		Short: "Initialize a new package.", |
| 63 | 		Long: `zigmod init [name] [main_file]`, |
| 64 | 		Run: func(cmd *cobra.Command, args []string) { |
| 65 | 			buf := new(bytes.Buffer) |
| 66 | |
| 67 | 			name := detectPkgName(tryIndex(args, 0)) |
| 68 | 			fmt.Fprintln(buf, "name:", name) |
| 69 | |
| 70 | 			mainf := detectMainFile(tryIndex(args, 1)) |
| 71 | 			fmt.Fprintln(buf, "main:", mainf) |
| 72 | |
| 73 | 			fmt.Fprintln(buf, "dependencies:") |
| 74 | 			f, err := os.Create("./zig.mod") |
| 75 | 			util.DieOnError(err) |
| 76 | |
| 77 | 			fmt.Fprint(f, buf.String()) |
| 78 | 			log.Println("Initialized a new package named", name, "with entry point", mainf) |
| 79 | 		}, |
| 80 | 	}) |
| 81 | } |