Files
go-omni/cmd/go-omni/main.go

111 lines
3.1 KiB
Go

package main
import (
"errors"
"fmt"
"os"
"path/filepath"
"strings"
"git.yuntuo.hk/k2safe/go-omni/cmd/go-omni/scaffold"
)
func main() {
if len(os.Args) < 2 {
usage()
os.Exit(2)
}
switch os.Args[1] {
case "new":
if err := runNew(os.Args[2:]); err != nil {
fmt.Fprintln(os.Stderr, "go-omni new:", err)
os.Exit(1)
}
case "help", "-h", "--help":
usage()
default:
fmt.Fprintf(os.Stderr, "unknown command %q\n", os.Args[1])
usage()
os.Exit(2)
}
}
func runNew(args []string) error {
options := scaffold.Options{}
var target string
for index := 0; index < len(args); index++ {
arg := args[index]
switch {
case arg == "--force":
options.Force = true
case arg == "--database":
if index+1 >= len(args) || strings.TrimSpace(args[index+1]) == "" {
return errors.New("--database requires memory or mysql")
}
index++
options.Database = args[index]
case strings.HasPrefix(arg, "--database="):
options.Database = strings.TrimPrefix(arg, "--database=")
if strings.TrimSpace(options.Database) == "" {
return errors.New("--database requires memory or mysql")
}
case arg == "--module":
if index+1 >= len(args) {
return errors.New("--module requires a value")
}
index++
options.Module = args[index]
case strings.HasPrefix(arg, "--module="):
options.Module = strings.TrimPrefix(arg, "--module=")
case arg == "--framework-dir":
if index+1 >= len(args) {
return errors.New("--framework-dir requires a value")
}
index++
options.FrameworkDir = args[index]
case strings.HasPrefix(arg, "--framework-dir="):
options.FrameworkDir = strings.TrimPrefix(arg, "--framework-dir=")
case arg == "--framework-version":
if index+1 >= len(args) || strings.TrimSpace(args[index+1]) == "" {
return errors.New("--framework-version requires a value")
}
index++
options.FrameworkVersion = args[index]
case strings.HasPrefix(arg, "--framework-version="):
options.FrameworkVersion = strings.TrimPrefix(arg, "--framework-version=")
if strings.TrimSpace(options.FrameworkVersion) == "" {
return errors.New("--framework-version requires a value")
}
case strings.HasPrefix(arg, "-"):
return fmt.Errorf("unknown option %q", arg)
case target == "":
target = arg
default:
return fmt.Errorf("unexpected argument %q", arg)
}
}
if target == "" {
return errors.New("project directory is required")
}
if options.Module == "" {
options.Module = filepath.Base(filepath.Clean(target))
}
options.Dir = target
if err := scaffold.Generate(options); err != nil {
return err
}
fmt.Printf("created GoOmni project %s\n", filepath.Clean(target))
return nil
}
func usage() {
fmt.Fprintln(os.Stderr, "GoOmni project tool")
fmt.Fprintln(os.Stderr, "")
fmt.Fprintln(os.Stderr, "Usage:")
fmt.Fprintln(os.Stderr, " go-omni new [--module <module>] [--force] <directory>")
fmt.Fprintln(os.Stderr, " --framework-version <version> Pin a remote framework version (defaults to CLI version)")
fmt.Fprintln(os.Stderr, " --framework-dir <directory> Use a local framework checkout")
fmt.Fprintln(os.Stderr, " --database <memory|mysql> Select generated storage (default memory)")
}