package main import ( "flag" "fmt" "io" "my/go-translator/pkg/service" "my/go-translator/pkg/service_python" "os" ) const ( CPP_MODE = iota PYTHON_MODE ) func main() { mode, target, header_file, addArduinoH, sources := getFlags() checkFlagsAreValid(sources) safeTranspile(mode, sources, target, header_file, addArduinoH) } func getFlags() (int, string, string, bool, []string) { pmode := flag.Bool("p", false, "Mode: C++ or Python") target := flag.String("o", "", "Write to file instead of stdout") header_file := flag.String("h", "", "Write headers to file also") addArduinoH := flag.Bool("a", false, "Add Arduino.h") flag.Parse() sources := flag.Args() mode := CPP_MODE if *pmode { mode = PYTHON_MODE } return mode, *target, *header_file, *addArduinoH, sources } func checkFlagsAreValid(sources []string) { if len(sources) == 0 { 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 [-a] [-h header.h] [-o output.cpp] [-p] \n\n") } func safeTranspile(mode int, sources []string, target, header_file string, addArduinoH bool) { files := []io.Reader{} var err error for _, src := range sources { in, err := os.Open(src) if err != nil { fmt.Fprintf(os.Stderr, "Go source file [%s] could not be opened! %v", src, err) os.Exit(1) } defer in.Close() files = append(files, in) } out := os.Stdout if target != "" { os.Remove(target) out, err = os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_SYNC, 0644) if err != nil { fmt.Fprintf(os.Stderr, "Arduino sketch file [%s] could not be opened! %v", target, err) os.Exit(1) } } var header_f *os.File if header_file != "" { os.Remove(header_file) header_f, err = os.OpenFile(header_file, os.O_CREATE|os.O_RDWR|os.O_SYNC, 0644) if err != nil { fmt.Fprintf(os.Stderr, "Header file [%s] could not be opened! %v", header_file, err) os.Exit(1) } } switch mode { case CPP_MODE: service := service.NewService(files, out) service.SetHeaderWriter(header_f) service.AddIncludeArduinoH(addArduinoH) if err := service.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) } case PYTHON_MODE: service := service_python.NewService(files[0], out) if err := service.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) } } }