// 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 }