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 getFlags() (int, string, string) { pmode := flag.Bool("p", false, "Mode: C++ or Python") flag.Parse() source := flag.Arg(0) target := flag.Arg(1) mode := CPP_MODE if *pmode { mode = PYTHON_MODE } return mode, source, target } func checkFlagsAreValid(source, target string) { if source == "" || target == "" { printUsage() os.Exit(1) } } func printUsage() { fmt.Print("This program transpiles Golang source into corresponding C++/python code.\n\n") fmt.Printf("Options:\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) } } }