复制项目
This commit is contained in:
77
pkg/rpccache/common.go
Normal file
77
pkg/rpccache/common.go
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright © 2024 OpenIM. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package rpccache
|
||||
|
||||
import (
|
||||
"github.com/openimsdk/tools/errs"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func newListMap[V comparable](values []V, err error) (*listMap[V], error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
lm := &listMap[V]{
|
||||
List: values,
|
||||
Map: make(map[V]struct{}, len(values)),
|
||||
}
|
||||
for _, value := range values {
|
||||
lm.Map[value] = struct{}{}
|
||||
}
|
||||
return lm, nil
|
||||
}
|
||||
|
||||
type listMap[V comparable] struct {
|
||||
List []V
|
||||
Map map[V]struct{}
|
||||
}
|
||||
|
||||
func respProtoMarshal(resp proto.Message, err error) ([]byte, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return proto.Marshal(resp)
|
||||
}
|
||||
|
||||
func cacheUnmarshal[V any](resp []byte, err error) (*V, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var val V
|
||||
if err := proto.Unmarshal(resp, any(&val).(proto.Message)); err != nil {
|
||||
return nil, errs.WrapMsg(err, "local cache proto.Unmarshal error")
|
||||
}
|
||||
return &val, nil
|
||||
}
|
||||
|
||||
type cacheProto[V any] struct{}
|
||||
|
||||
func (cacheProto[V]) Marshal(resp *V, err error) ([]byte, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return proto.Marshal(any(resp).(proto.Message))
|
||||
}
|
||||
|
||||
func (cacheProto[V]) Unmarshal(resp []byte, err error) (*V, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var val V
|
||||
if err := proto.Unmarshal(resp, any(&val).(proto.Message)); err != nil {
|
||||
return nil, errs.WrapMsg(err, "local cache proto.Unmarshal error")
|
||||
}
|
||||
return &val, nil
|
||||
}
|
||||
Reference in New Issue
Block a user