1414
1515import NIOCore
1616@preconcurrency import RediStack
17+ import Dependencies
18+ import DependenciesMacros
1719
1820
19- actor Redis {
20- var client : RedisClient
21+ @DependencyClient
22+ struct RedisClient {
23+ var set : @Sendable ( _ key: String , _ value: String ? ) async -> Void
24+ var get : @Sendable ( _ key: String ) async -> String ?
25+ }
26+
27+
28+ extension RedisClient : DependencyKey {
29+ static var liveValue : RedisClient {
30+ . init(
31+ set: { key, value in await Redis . shared? . set ( key: key, value: value) } ,
32+ get: { key in await Redis . shared? . get ( key: key) }
33+ )
34+ }
35+ }
36+
37+
38+ extension RedisClient : TestDependencyKey {
39+ static var testValue : Self { Self ( ) }
40+ }
41+
42+
43+ extension DependencyValues {
44+ var redis : RedisClient {
45+ get { self [ RedisClient . self] }
46+ set { self [ RedisClient . self] = newValue }
47+ }
48+ }
49+
50+
51+ private actor Redis {
52+ var client : RediStack . RedisClient
2153 static private var task : Task < Redis ? , Never > ?
2254
2355 static var shared : Redis ? {
@@ -51,14 +83,14 @@ actor Redis {
5183 self . client = try await connection. get ( )
5284 }
5385
86+ #warning("move expiry to interface")
5487 static let expirationInSeconds = 5 * 60
5588 static let hostname = " redis "
5689 static let maxConnectionAttempts = 3
5790
58- func set( owner: String , repository: String , reference: String ? ) async -> Void {
59- let key = " \( owner) / \( repository) " . lowercased ( )
60- if let reference {
61- let buffer = ByteBuffer ( string: reference)
91+ func set( key: String , value: String ? ) async -> Void {
92+ if let value {
93+ let buffer = ByteBuffer ( string: value)
6294 try ? await client. setex ( . init( key) ,
6395 to: RESPValue . bulkString ( buffer) ,
6496 expirationInSeconds: Self . expirationInSeconds) . get ( )
@@ -67,8 +99,7 @@ actor Redis {
6799 }
68100 }
69101
70- func get( owner: String , repository: String ) async -> String ? {
71- let key = " \( owner) / \( repository) " . lowercased ( )
102+ func get( key: String ) async -> String ? {
72103 return try ? await client. get ( . init( key) ) . map ( \. string) . get ( )
73104 }
74105}
0 commit comments