trpc.group/trpc-go/trpc-go@v1.0.3/codec/serialization_fb.go (about)

     1  //
     2  //
     3  // Tencent is pleased to support the open source community by making tRPC available.
     4  //
     5  // Copyright (C) 2023 THL A29 Limited, a Tencent company.
     6  // All rights reserved.
     7  //
     8  // If you have downloaded a copy of the tRPC source code from Tencent,
     9  // please note that tRPC source code is licensed under the  Apache 2.0 License,
    10  // A copy of the Apache 2.0 License is included in this file.
    11  //
    12  //
    13  
    14  package codec
    15  
    16  import (
    17  	"errors"
    18  
    19  	flatbuffers "github.com/google/flatbuffers/go"
    20  )
    21  
    22  func init() {
    23  	RegisterSerializer(SerializationTypeFlatBuffer, &FBSerialization{})
    24  }
    25  
    26  // FBSerialization provides the flatbuffers serialization mode.
    27  // Flatbuffers official url: https://google.github.io/flatbuffers
    28  type FBSerialization struct{}
    29  
    30  // Unmarshal deserializes the in bytes into body param, body
    31  // should implement flatbuffersInit interface.
    32  func (*FBSerialization) Unmarshal(in []byte, body interface{}) error {
    33  	body, ok := body.(flatbuffersInit)
    34  	if !ok {
    35  		return errors.New("unmarshal fail: body does not implement flatbufferInit interface")
    36  	}
    37  	body.(flatbuffersInit).Init(in, flatbuffers.GetUOffsetT(in))
    38  	return nil
    39  }
    40  
    41  // Marshal returns the serialized bytes, body should be a flatbuffers.Builder.
    42  func (*FBSerialization) Marshal(body interface{}) ([]byte, error) {
    43  	builder, ok := body.(*flatbuffers.Builder)
    44  	if !ok {
    45  		return nil, errors.New("marshal fail: body not *flatbuffers.Builder")
    46  	}
    47  	return builder.FinishedBytes(), nil
    48  }
    49  
    50  type flatbuffersInit interface {
    51  	Init(data []byte, i flatbuffers.UOffsetT)
    52  }