github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/serializer/response.go (about)

     1  package serializer
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/base64"
     6  	"encoding/gob"
     7  )
     8  
     9  // Response 基础序列化器
    10  type Response struct {
    11  	Code  int         `json:"code"`
    12  	Data  interface{} `json:"data,omitempty"`
    13  	Msg   string      `json:"msg"`
    14  	Error string      `json:"error,omitempty"`
    15  }
    16  
    17  // NewResponseWithGobData 返回Data字段使用gob编码的Response
    18  func NewResponseWithGobData(data interface{}) Response {
    19  	var w bytes.Buffer
    20  	encoder := gob.NewEncoder(&w)
    21  	if err := encoder.Encode(data); err != nil {
    22  		return Err(CodeInternalSetting, "Failed to encode response content", err)
    23  	}
    24  
    25  	return Response{Data: w.Bytes()}
    26  }
    27  
    28  // GobDecode 将 Response 正文解码至目标指针
    29  func (r *Response) GobDecode(target interface{}) {
    30  	src := r.Data.(string)
    31  	raw := make([]byte, len(src)*len(src)/base64.StdEncoding.DecodedLen(len(src)))
    32  	base64.StdEncoding.Decode(raw, []byte(src))
    33  	decoder := gob.NewDecoder(bytes.NewBuffer(raw))
    34  	decoder.Decode(target)
    35  }