package main import ( "flag" "fmt" "my/go-translator/transpile" "my/go-translator/transpile_python" "os" ) const ( CPP_MODE = iota PYTHON_MODE ) func main() { mode, source, target := getFlags() checkFlagsAreValid(source, target) safeTranspile(mode, source, target) } func checkFlagsAreValid(source, target string) { if source == "" || target == "" { printUsage() os.Exit(1) } } func getFlags() (int, string, string) { // source := flag.String("source", "", "Golang source file") // target := flag.String("target", "", "Arduino sketch file") flag.Parse() mode := CPP_MODE source := flag.Arg(0) target := flag.Arg(1) if source == "-p" { mode = PYTHON_MODE source = flag.Arg(1) target = flag.Arg(2) } return mode, source, target } func printUsage() { fmt.Print("This program transpiles Golang source into corresponding C++/python code.\n\n") fmt.Printf("Options:\n by default C++ mode\n -p - python mode\n") flag.PrintDefaults() fmt.Print("\n") fmt.Print("Example:\n") fmt.Printf("\tgo-tr [-p] controller.go controller.ino\n\n") } func safeTranspile(mode int, source, target string) { // Read the Golang source file. in, err := os.Open(source) if err != nil { fmt.Fprintf(os.Stderr, "Go source file [%s] could not be opened! %v", source, err) os.Exit(1) } defer in.Close() // Create the Arduino sketch file. os.Remove(target) out, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_SYNC, 0666) if err != nil { fmt.Fprintf(os.Stderr, "Arduino sketch file [%s] could not be opened! %v", target, err) os.Exit(1) } switch mode { case CPP_MODE: // Transpiles the Golang source into Arduino sketch. service := transpile.NewService(in, out) if err := service.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) } case PYTHON_MODE: service := transpile_python.NewService(in, out) if err := service.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) } } }