Example #1
0
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)
	}

}
Example #2
0
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)
			}
		}
	}
}