diff --git a/cmd/hopp-generate/main.go b/cmd/hopp-generate/main.go new file mode 100644 index 0000000..3e38b0d --- /dev/null +++ b/cmd/hopp-generate/main.go @@ -0,0 +1,58 @@ +package main + +import "os" +import "fmt" +import "strings" +import "path/filepath" +import "git.tebibyte.media/sashakoshka/hopp/generate" + +func main() { + name := os.Args[0] + if len(os.Args) != 3 { + fmt.Fprintf(os.Stderr, "Usage: %s SOURCE DESTINATION\n", name) + os.Exit(2) + } + source := os.Args[1] + destination := os.Args[2] + + input, err := os.Open(source) + handleErr(1, err) + defer input.Close() + protocol, err := generate.ParseReader(input) + handleErr(1, err) + + absDestination, err := filepath.Abs(destination) + handleErr(1, err) + packageName := cleanPackageName(strings.ReplaceAll( + strings.ToLower(filepath.Base(absDestination)), + " ", "_")) + destination = filepath.Join(os.Args[2], "generated.go") + + output, err := os.Create(destination) + handleErr(1, err) + err = protocol.Generate(output, packageName) + handleErr(1, err) + fmt.Fprintf(os.Stderr, "%s: OK\n", name) +} + +func handleErr(code int, err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err) + os.Exit(code) + } +} + +func cleanPackageName(str string) string { + buffer := []byte(str) + j := 0 + for _, b := range buffer { + if ('a' <= b && b <= 'z') || + ('A' <= b && b <= 'Z') || + ('0' <= b && b <= '9') || + b == '_' || b == ' ' { + buffer[j] = b + j++ + } + } + return string(buffer[:j]) +}