proto.go (1512B)
1 /* 2 * 3 * Copyright 2018 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 // Package proto defines the protobuf codec. Importing this package will 20 // register the codec. 21 package proto 22 23 import ( 24 "fmt" 25 26 "github.com/golang/protobuf/proto" 27 "google.golang.org/grpc/encoding" 28 ) 29 30 // Name is the name registered for the proto compressor. 31 const Name = "proto" 32 33 func init() { 34 encoding.RegisterCodec(codec{}) 35 } 36 37 // codec is a Codec implementation with protobuf. It is the default codec for gRPC. 38 type codec struct{} 39 40 func (codec) Marshal(v interface{}) ([]byte, error) { 41 vv, ok := v.(proto.Message) 42 if !ok { 43 return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) 44 } 45 return proto.Marshal(vv) 46 } 47 48 func (codec) Unmarshal(data []byte, v interface{}) error { 49 vv, ok := v.(proto.Message) 50 if !ok { 51 return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v) 52 } 53 return proto.Unmarshal(data, vv) 54 } 55 56 func (codec) Name() string { 57 return Name 58 }