Skip to content

Commit 58ac3c1

Browse files
committed
Add basic non-NIO wrappers for Redis
1 parent bff48dd commit 58ac3c1

File tree

4 files changed

+66
-2
lines changed

4 files changed

+66
-2
lines changed

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ let package = Package(
66
name: "Redis",
77
products: [
88
.library(name: "NIORedis", targets: ["NIORedis"]),
9-
//.library(name: "Redis", targets: [""])
9+
.library(name: "Redis", targets: ["Redis"])
1010
],
1111
dependencies: [
1212
.package(url: "https://github.com/apple/swift-nio.git", .branch("master"))
1313
],
1414
targets: [
1515
.target(name: "NIORedis", dependencies: ["NIO"]),
16-
//.target(name: "Redis", dependencies: ["NIORedis"]),
16+
.target(name: "Redis", dependencies: ["NIORedis"]),
1717
.testTarget(name: "NIORedisTests", dependencies: ["NIORedis", "NIO"]),
1818
//.testTarget(name: "RedisTests", dependencies: ["Redis"])
1919
]

Sources/NIORedis/Exported.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@_exported import NIO

Sources/Redis/Redis.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import Foundation
2+
import NIO
3+
import NIORedis
4+
5+
/// A factory that handles all necessary details for creating `RedisConnection` instances.
6+
public final class Redis {
7+
private let driver: NIORedis
8+
9+
deinit { try? driver.terminate() }
10+
11+
public init(threadCount: Int = 1) {
12+
self.driver = NIORedis(executionModel: .spawnThreads(threadCount))
13+
}
14+
15+
public func makeConnection(
16+
hostname: String = "localhost",
17+
port: Int = 6379,
18+
password: String? = nil,
19+
queue: DispatchQueue = .main,
20+
_ callback: @escaping (Result<RedisConnection, Error>) -> Void
21+
) {
22+
driver.makeConnection(hostname: hostname, port: port, password: password)
23+
.map {
24+
let connection = RedisConnection(driver: $0, callbackQueue: queue)
25+
queue.async {
26+
callback(.success(connection))
27+
}
28+
}
29+
.whenFailure { error in
30+
queue.async {
31+
callback(.failure(error))
32+
}
33+
}
34+
}
35+
}

Sources/Redis/RedisConnection.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Foundation
2+
import NIORedis
3+
4+
public final class RedisConnection {
5+
private let driverConnection: NIORedisConnection
6+
private let queue: DispatchQueue
7+
8+
init(driver: NIORedisConnection, callbackQueue: DispatchQueue) {
9+
self.driverConnection = driver
10+
self.queue = callbackQueue
11+
}
12+
13+
public func get(
14+
_ key: String,
15+
queue: DispatchQueue = .main,
16+
_ callback: @escaping (Result<String?, Error>
17+
) -> Void) {
18+
// TODO: Make this a generic method to avoid copy/paste
19+
driverConnection.get(key)
20+
.map { result in
21+
queue.async { callback(.success(result)) }
22+
}
23+
.whenFailure { error in
24+
queue.async { callback(.failure(error)) }
25+
}
26+
}
27+
}
28+

0 commit comments

Comments
 (0)