@@ -158,51 +158,80 @@ func resolveBackend[T backend.IBackendConstrain](bm *BackendManager, config *Con
158158
159159 switch config .BackendType {
160160 case constants .InMemoryBackend :
161- inMemoryConstructor , ok := constructor .(InMemoryBackendConstructor )
162- if ! ok {
163- return nil , sentinel .ErrInvalidBackendType
164- }
161+ return resolveInMemoryBackend [T ](constructor , config )
162+ case constants .RedisBackend :
163+ return resolveRedisBackend [T ](constructor , config )
164+ case constants .RedisClusterBackend :
165+ return resolveRedisClusterBackend [T ](constructor , config )
166+ default :
167+ return nil , ewrap .Newf ("unknown backend type: %s" , config .BackendType )
168+ }
169+ }
165170
166- cfg , ok := any (config ).(* Config [backend.InMemory ])
167- if ! ok {
168- return nil , sentinel .ErrInvalidBackendType
169- }
171+ // castBackend tries to cast a backend instance of any concrete type to backend.IBackend[T].
172+ func castBackend [T backend.IBackendConstrain ](bi any ) (backend.IBackend [T ], error ) {
173+ if b , ok := bi .(backend.IBackend [T ]); ok {
174+ return b , nil
175+ }
170176
171- bi , err := inMemoryConstructor .Create (cfg )
172- if err != nil {
173- return nil , err
174- }
177+ return nil , sentinel .ErrInvalidBackendType
178+ }
175179
176- if b , ok := any (bi ).(backend.IBackend [T ]); ok {
177- return b , nil
178- }
180+ func resolveInMemoryBackend [T backend.IBackendConstrain ](constructor any , cfgAny any ) (backend.IBackend [T ], error ) {
181+ inMemCtor , ok := constructor .(InMemoryBackendConstructor )
182+ if ! ok {
183+ return nil , sentinel .ErrInvalidBackendType
184+ }
179185
186+ cfg , ok := cfgAny .(* Config [backend.InMemory ])
187+ if ! ok {
180188 return nil , sentinel .ErrInvalidBackendType
189+ }
181190
182- case constants .RedisBackend :
183- redisConstructor , ok := constructor .(RedisBackendConstructor )
184- if ! ok {
185- return nil , sentinel .ErrInvalidBackendType
186- }
191+ bi , err := inMemCtor .Create (cfg )
192+ if err != nil {
193+ return nil , err
194+ }
187195
188- cfg , ok := any (config ).(* Config [backend.Redis ])
189- if ! ok {
190- return nil , sentinel .ErrInvalidBackendType
191- }
196+ return castBackend [T ](bi )
197+ }
192198
193- bi , err := redisConstructor .Create (cfg )
194- if err != nil {
195- return nil , err
196- }
199+ func resolveRedisBackend [T backend.IBackendConstrain ](constructor any , cfgAny any ) (backend.IBackend [T ], error ) {
200+ redisCtor , ok := constructor .(RedisBackendConstructor )
201+ if ! ok {
202+ return nil , sentinel .ErrInvalidBackendType
203+ }
197204
198- if b , ok := any (bi ).(backend.IBackend [T ]); ok {
199- return b , nil
200- }
205+ cfg , ok := cfgAny .(* Config [backend.Redis ])
206+ if ! ok {
207+ return nil , sentinel .ErrInvalidBackendType
208+ }
209+
210+ bi , err := redisCtor .Create (cfg )
211+ if err != nil {
212+ return nil , err
213+ }
214+
215+ return castBackend [T ](bi )
216+ }
201217
218+ func resolveRedisClusterBackend [T backend.IBackendConstrain ](constructor any , cfgAny any ) (backend.IBackend [T ], error ) {
219+ clusterCtor , ok := constructor .(RedisClusterBackendConstructor )
220+ if ! ok {
202221 return nil , sentinel .ErrInvalidBackendType
203222 }
204223
205- return nil , ewrap .Newf ("unknown backend type: %s" , config .BackendType )
224+ cfg , ok := cfgAny .(* Config [backend.RedisCluster ])
225+ if ! ok {
226+ return nil , sentinel .ErrInvalidBackendType
227+ }
228+
229+ bi , err := clusterCtor .Create (cfg )
230+ if err != nil {
231+ return nil , err
232+ }
233+
234+ return castBackend [T ](bi )
206235}
207236
208237// newHyperCacheBase builds the base HyperCache instance with default timings and internals.
0 commit comments