github.com/s7techlab/cckit@v0.10.5/gateway/protoc-gen-cc-gateway/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"io"
     6  	"log"
     7  	"os"
     8  
     9  	"github.com/golang/protobuf/proto"
    10  	plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
    11  	"github.com/grpc-ecosystem/grpc-gateway/codegenerator"
    12  	"github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor"
    13  
    14  	"github.com/s7techlab/cckit/gateway/protoc-gen-cc-gateway/generator"
    15  )
    16  
    17  var (
    18  	file = flag.String("file", "-", "where to load data from")
    19  )
    20  
    21  func main() {
    22  	var err error
    23  	flag.Parse()
    24  	if err = flag.Lookup("logtostderr").Value.Set("true"); err != nil {
    25  		log.Fatal(err)
    26  	}
    27  
    28  	reg := descriptor.NewRegistry()
    29  	fs := os.Stdin
    30  	if *file != "-" {
    31  		if fs, err = os.Open(*file); err != nil {
    32  			log.Fatal(err)
    33  		}
    34  	}
    35  	req, err := codegenerator.ParseRequest(fs)
    36  	if err != nil {
    37  		log.Fatal(err)
    38  	}
    39  
    40  	if err = reg.Load(req); err != nil {
    41  		emitError(err)
    42  		return
    43  	}
    44  
    45  	g := generator.New(reg)
    46  	g.Opts = generator.OptsFromParams(req.GetParameter())
    47  
    48  	var (
    49  		targets []*descriptor.File
    50  		f       *descriptor.File
    51  	)
    52  	for _, target := range req.FileToGenerate {
    53  		if f, err = reg.LookupFile(target); err != nil {
    54  			log.Fatal(err)
    55  		}
    56  		targets = append(targets, f)
    57  	}
    58  
    59  	out, err := g.Generate(targets)
    60  	if err != nil {
    61  		emitError(err)
    62  		return
    63  	}
    64  	emitFiles(os.Stdout, out)
    65  }
    66  
    67  func emitFiles(w io.Writer, out []*plugin.CodeGeneratorResponse_File) {
    68  	emitResp(w, &plugin.CodeGeneratorResponse{File: out})
    69  }
    70  
    71  func emitError(err error) {
    72  	emitResp(os.Stdout, &plugin.CodeGeneratorResponse{Error: proto.String(err.Error())})
    73  }
    74  
    75  func emitResp(out io.Writer, resp *plugin.CodeGeneratorResponse) {
    76  	buf, err := proto.Marshal(resp)
    77  	if err != nil {
    78  		log.Fatal(err)
    79  	}
    80  	if _, err := out.Write(buf); err != nil {
    81  		log.Fatal(err)
    82  	}
    83  }