func main() { if len(os.Args) == 1 { os.Exit(1) } backend, ok := schema.Backends[os.Args[1]] if !ok { fmt.Fprintln(os.Stderr, "No such backend, available backends are:") for name := range schema.Backends { fmt.Fprintln(os.Stderr, name) } os.Exit(1) } flags := backend.Flags() SchemaFile := "" Debug := false flags.StringVar(&SchemaFile, "schema", "", "Schema file to process") flags.BoolVar(&Debug, "debug", false, "Pretty print the resulting schema defs") flags.Parse(os.Args[2:]) if SchemaFile == "" { log.Fatal("No file specified") } file, err := os.Open(SchemaFile) if err != nil { log.Fatalf("Error opening schema file: %s", err) } if file == nil { log.Fatalf("error opening file %s", file) } s, err := schema.ParseSchema(file) if Debug { pretty.Print(s) } if err != nil { log.Fatalf("Error parsing schema: %s", err) } code, err := backend.Generate(s) if err != nil { log.Fatalf("Error generating output: %s", err) } err = ioutil.WriteFile(backend.GeneratedFilename(SchemaFile), []byte(code), 0666) if err != nil { log.Fatalf("Error writing output file: %s", err) } }
func TestGolangBackend(t *testing.T) { dir, err := ioutil.TempDir("", "gencode") if err != nil { t.Fatalf("Failed to create temp dir: %v", err) } defer os.RemoveAll(dir) for _, tc := range []string{ "array.schema", "int.schema", } { inputF := filepath.Join("./testdata", tc) outputF := filepath.Join(dir, tc+".go") goldenF := inputF + ".golden.go" in, err := ioutil.ReadFile(inputF) if err != nil { t.Fatalf("%v: Failed to read: %v", tc, err) } s, err := schema.ParseSchema(bytes.NewReader(in)) if err != nil { t.Fatalf("%v: Failed schema.ParseSchema: %v", tc, err) } b := GolangBackend{Package: "testdata"} g, err := b.Generate(s) if err != nil { t.Fatalf("%v: Failed Generate: %v", tc, err) } out := []byte(g) if err = ioutil.WriteFile(outputF, out, 0777); err != nil { t.Fatalf("%v: Failed to write generated file: %v", tc, err) } if out, err := exec.Command("go", "build", outputF).CombinedOutput(); err != nil { t.Fatalf("%v: Failed to compile generated code (error: %v):\n%s", tc, err, out) } want, err := ioutil.ReadFile(goldenF) needUpdate := true if err != nil { t.Errorf("%v: Failed to read golden file: %v", tc, err) } else if diff := pretty.Diff(want, out); len(diff) != 0 { t.Errorf("%v: Diff(want, got) = %v", tc, strings.Join(diff, "\n")) } else { needUpdate = false } if needUpdate && *update { if err := ioutil.WriteFile(goldenF, out, 0777); err != nil { t.Errorf("%v: Failed to update golden file: %v", tc, err) } } } }