// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// The protoc-gen-go binary is a protoc plugin to generate a Go protocol
// buffer package.
package main

import (
	"google.golang.org/proto/protogen"
)

func main() {
	protogen.Run(func(gen *protogen.Plugin) error {
		for _, f := range gen.Files {
			if !f.Generate {
				continue
			}
			genFile(gen, f)
		}
		return nil
	})
}

func genFile(gen *protogen.Plugin, f *protogen.File) {
	g := gen.NewGeneratedFile(f.GeneratedFilenamePrefix+".pb.go", f.GoImportPath)
	g.P("// Code generated by protoc-gen-go. DO NOT EDIT.")
	g.P("// source: ", f.Desc.Path())
	g.P()
	g.P("package ", f.GoPackageName)
	g.P()

	for _, m := range f.Messages {
		genMessage(gen, g, m)
	}

	// TODO: Everything.
}

func genMessage(gen *protogen.Plugin, g *protogen.GeneratedFile, m *protogen.Message) {
	g.P("type ", m.GoIdent, " struct {")
	g.P("}")
	g.P()

	for _, nested := range m.Messages {
		genMessage(gen, g, nested)
	}
}
