103 lines
2.6 KiB
Go
103 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.yuntuo.hk/k2safe/go-omni/cmd/go-omni/projectgen"
|
|
)
|
|
|
|
func runProject(args []string) error {
|
|
if len(args) == 0 || args[0] == "help" || args[0] == "--help" || args[0] == "-h" {
|
|
projectUsage()
|
|
return nil
|
|
}
|
|
command := args[0]
|
|
if command != "new" && command != "generate" && command != "check" {
|
|
return fmt.Errorf("unknown project command %q", command)
|
|
}
|
|
o := projectgen.Options{Check: command == "check"}
|
|
for i := 1; i < len(args); i++ {
|
|
arg := args[i]
|
|
if arg == "--help" || arg == "-h" {
|
|
projectUsage()
|
|
return nil
|
|
}
|
|
if arg == "--check" || arg == "--dry-run" {
|
|
if command != "generate" {
|
|
return fmt.Errorf("%s belongs to project generate", arg)
|
|
}
|
|
if arg == "--check" {
|
|
o.Check = true
|
|
} else {
|
|
o.DryRun = true
|
|
}
|
|
continue
|
|
}
|
|
if !strings.HasPrefix(arg, "-") {
|
|
if command != "new" || o.Dir != "" {
|
|
return fmt.Errorf("unexpected argument %q", arg)
|
|
}
|
|
o.Dir = arg
|
|
continue
|
|
}
|
|
name, value, inline := strings.Cut(arg, "=")
|
|
switch name {
|
|
case "--dir", "--module", "--framework-dir", "--framework-version":
|
|
default:
|
|
return fmt.Errorf("unknown project option %q", name)
|
|
}
|
|
if command != "new" && name != "--dir" {
|
|
return fmt.Errorf("%s belongs to project new", name)
|
|
}
|
|
if !inline {
|
|
if i+1 >= len(args) || strings.HasPrefix(args[i+1], "-") {
|
|
return fmt.Errorf("%s requires a value", name)
|
|
}
|
|
i++
|
|
value = args[i]
|
|
}
|
|
if strings.TrimSpace(value) == "" {
|
|
return fmt.Errorf("%s requires a value", name)
|
|
}
|
|
switch name {
|
|
case "--dir":
|
|
if o.Dir != "" {
|
|
return errors.New("project directory specified more than once")
|
|
}
|
|
o.Dir = value
|
|
case "--module":
|
|
o.Module = value
|
|
case "--framework-dir":
|
|
o.FrameworkDir = value
|
|
case "--framework-version":
|
|
o.FrameworkVersion = value
|
|
}
|
|
}
|
|
var out projectgen.Output
|
|
var err error
|
|
if command == "new" {
|
|
out, err = projectgen.New(o)
|
|
} else {
|
|
out, err = projectgen.Generate(o)
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if o.DryRun {
|
|
for _, change := range out.Changes {
|
|
fmt.Printf("%-7s %s\n", change.Action, change.Path)
|
|
}
|
|
} else {
|
|
fmt.Printf("project %s: %d file changes\n", command, len(out.Changes))
|
|
}
|
|
return nil
|
|
}
|
|
func projectUsage() {
|
|
fmt.Println("go-omni project new <directory> [--module <module>] [--framework-version <version>|--framework-dir <directory>]")
|
|
fmt.Println("go-omni project generate [--dir <project>] [--check|--dry-run]")
|
|
fmt.Println("go-omni project check [--dir <project>]")
|
|
fmt.Println("Creates a plain Go program with config, logging, dependency lifecycle and an editable Run entry.")
|
|
}
|