Skip to content

Commit a4304e6

Browse files
ayushi2103“Ayushi
andauthored
Added delete range request (#9)
Co-authored-by: “Ayushi <“[email protected]”>
1 parent 2d5a1d2 commit a4304e6

File tree

4 files changed

+63
-18
lines changed

4 files changed

+63
-18
lines changed

Sources/ETCD/DeleteRangeRequest.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the swift-etcd-client-gsoc open source project
4+
//
5+
// Copyright (c) 2024 Apple Inc. and the swift-etcd-client-gsoc project authors
6+
// Licensed under Apache License v2.0
7+
//
8+
// See LICENSE.txt for license information
9+
// See CONTRIBUTORS.txt for the list of swift-etcd-client-gsoc project authors
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
import Foundation
16+
17+
/// Struct representing a delete range request in etcd server.
18+
public struct DeleteRangeRequest {
19+
public var key: Data
20+
public var rangeEnd: Data?
21+
public var prevKV: Bool = false
22+
23+
init(protoDeleteRangeRequest: Etcdserverpb_DeleteRangeRequest) {
24+
self.key = protoDeleteRangeRequest.key
25+
self.rangeEnd = protoDeleteRangeRequest.rangeEnd.isEmpty ? nil : protoDeleteRangeRequest.rangeEnd
26+
self.prevKV = protoDeleteRangeRequest.prevKv
27+
}
28+
29+
/// Struct representing a deleteRangeRequest in etcd.
30+
///
31+
/// - Parameters:
32+
/// - key: key of type Data.
33+
/// - rangeEnd: The key range to fetch until.
34+
/// - prevKV: when set, return the contents of the deleted key-value pairs.
35+
public init(key: Data, rangeEnd: Data? = nil, prevKV: Bool = false) {
36+
self.key = key
37+
self.rangeEnd = rangeEnd
38+
self.prevKV = prevKV
39+
}
40+
41+
func toProto() -> Etcdserverpb_DeleteRangeRequest {
42+
var protoDeleteRangeRequest = Etcdserverpb_DeleteRangeRequest()
43+
protoDeleteRangeRequest.key = self.key
44+
if let rangeEnd = self.rangeEnd {
45+
protoDeleteRangeRequest.rangeEnd = rangeEnd
46+
}
47+
protoDeleteRangeRequest.prevKv = self.prevKV
48+
return protoDeleteRangeRequest
49+
}
50+
}

Sources/ETCD/ETCDClient.swift

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,15 @@ public final class EtcdClient: @unchecked Sendable {
7878
return kv.value
7979
}
8080

81-
/// Delete the value for a key from the ETCD server.
81+
/// Delete the value for a range from the ETCD server.
8282
///
83-
/// - Parameter key: The key to delete. Parameter is of type Sequence<UInt8>.
84-
public func delete(_ key: some Sequence<UInt8>) async throws {
85-
var deleteRangeRequest = Etcdserverpb_DeleteRangeRequest()
86-
deleteRangeRequest.key = Data(key)
87-
let call = client.deleteRange(deleteRangeRequest)
83+
/// - Parameter deleteRangeRequest: The rangeRequest to delete.
84+
public func deleteRange(_ deleteRangeRequest: DeleteRangeRequest) async throws {
85+
let protoDeleteRangeRequest = deleteRangeRequest.toProto()
86+
let call = client.deleteRange(protoDeleteRangeRequest)
8887
_ = try await call.response.get()
8988
}
9089

91-
/// Deletes the value for a key from the ETCD server.
92-
///
93-
/// - Parameter key: The key to delete the value for. Parameter is of type String.
94-
public func delete(_ key: String) async throws {
95-
return try await delete(key.utf8)
96-
}
97-
9890
/// Puts a value for a specified key in the ETCD server. If the key does not exist, a new key, value pair is created.
9991
///
10092
/// - Parameters:

Sources/ETCDExample/ETCDExample.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ struct Example {
4040
try await etcdClient.set("foo", value: "bar")
4141
let key = "foo".data(using: .utf8)!
4242
let rangeRequest = RangeRequest(key: key)
43-
if let value = try await etcdClient.get(rangeRequest: rangeRequest) {
43+
if let value = try await etcdClient.getRange(rangeRequest) {
4444
if let stringValue = String(data: value, encoding: .utf8) {
4545
print("Value is: \(stringValue)")
46-
try await etcdClient.delete("foo")
46+
let deleteRangeRequest = DeleteRangeRequest(key: key)
47+
try await etcdClient.deleteRange(deleteRangeRequest)
4748
print("Key deleted")
4849

4950
// Trying to get the value again
50-
let deletedValue = try await etcdClient.get(rangeRequest: rangeRequest)
51+
let deletedValue = try await etcdClient.getRange(rangeRequest)
5152
if deletedValue == nil {
5253
print("Key not found after deletion")
5354
} else {

Tests/ETCDTests/ETCDTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ final class EtcdClientTests: XCTestCase {
5151
var fetchedValue = try await etcdClient.getRange(rangeRequest)
5252
XCTAssertNotNil(fetchedValue)
5353

54-
try await etcdClient.delete(key)
54+
let deleteRangeRequest = DeleteRangeRequest(key: rangeRequestKey)
55+
try await etcdClient.deleteRange(deleteRangeRequest)
5556

5657
fetchedValue = try await etcdClient.getRange(rangeRequest)
5758
XCTAssertNil(fetchedValue)
@@ -64,7 +65,8 @@ final class EtcdClientTests: XCTestCase {
6465
var fetchedValue = try await etcdClient.getRange(rangeRequest)
6566
XCTAssertNil(fetchedValue)
6667

67-
try await etcdClient.delete(key)
68+
let deleteRangeRequest = DeleteRangeRequest(key: key)
69+
try await etcdClient.deleteRange(deleteRangeRequest)
6870

6971
fetchedValue = try await etcdClient.getRange(rangeRequest)
7072
XCTAssertNil(fetchedValue)

0 commit comments

Comments
 (0)