package main import ( "flag" "fmt" "io" "log" "os" "sync" "text/template" "github.com/davecgh/go-spew/spew" _ "embed" ) //go:embed class.tmpl var templatestr string var Error *log.Logger var Warning *log.Logger func init() { log.SetFlags(log.Lmicroseconds | log.Lshortfile) logger := io.MultiWriter(os.Stdout) log.SetOutput(logger) Error = log.New(io.MultiWriter(os.Stderr, os.Stdout), fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) Warning = log.New(io.MultiWriter(os.Stdout), fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) spew.Config.Indent = " " spew.Config.SortKeys = true } var fns = template.FuncMap{ "plus1": func(x int) int { return x + 1 }, } func main() { outdir := flag.String("o", ".", "Output directory") flag.Parse() files := flag.Args() if len(files) == 0 { Error.Printf("No files specified") flag.Usage() return } ltemplate, err := template.New("class").Funcs(fns).Parse(templatestr) if err != nil { Error.Printf("Error parsing template: %v", err) return } wg := sync.WaitGroup{} for _, file := range files { wg.Add(1) go func(file string) { defer wg.Done() class, err := ParseClass(file) if err != nil { Error.Printf("Error parsing file: %v", err) return } class.Write(*outdir, ltemplate) }(file) } wg.Wait() } func MapType(t string) string { switch t { case "var": return "any" case "int": return "number" case "float": return "number" case "double": return "number" case "bool": return "boolean" case "table_t": return "table" default: return t } }