Skip to content

Latest commit

 

History

History
79 lines (70 loc) · 3.15 KB

README.md

File metadata and controls

79 lines (70 loc) · 3.15 KB

🚧WIP🚧: Swift ETCD client

Swift ETCD is a Swift Package that provides a convenient way to communicate with etcd servers.

Getting Started

To depend on Swift ETCD within your own project, you can add a dependencies clause to your Package.swift

dependencies: [
    .package(url: "https://github.com/swift-server/swift-etcd-client-gsoc")
]

Overview

The ETCD Client allows for communication with an ETCD Server. The Client takes care of establishing a connection, and handling asynchronous execution of commands.

Here's an example of how you can use the ETCD Client

struct Example {
    static func main() async throws {
        let eventLoopGroup = MultiThreadedEventLoopGroup.singleton
        do {
            let etcdClient = EtcdClient(host: "localhost", port: 2379, eventLoopGroup: eventLoopGroup)
            try await withThrowingTaskGroup(of: Void.self) { group in
                group.addTask {
                    do {
                        try await etcdClient.watch("foo") { sequence in
                            var iterator = sequence.makeAsyncIterator()
                            while let event = try await iterator.next() {
                                print(event)
                            }
                        }
                    } catch {
                        print("Error watching key: \(error)")
                    }
                }
                // Sleeping for a second to let the watch above setup
                try await Task.sleep(for: .seconds(1))
                
                try await etcdClient.set("foo", value: "bar")
                let key = "foo".data(using: .utf8)!
                let rangeRequest = RangeRequest(key: key)
                if let value = try await etcdClient.getRange(rangeRequest) {
                    if let stringValue = String(data: value, encoding: .utf8) {
                        print("Value is: \(stringValue)")
                        let deleteRangeRequest = DeleteRangeRequest(key: key)
                        try await etcdClient.deleteRange(deleteRangeRequest)
                        print("Key deleted")
                        
                        // Trying to get the value again
                        let deletedValue = try await etcdClient.getRange(rangeRequest)
                        if deletedValue == nil {
                            print("Key not found after deletion")
                        } else {
                            print("Value after deletion: \(deletedValue!)")
                        }
                    } else {
                        print("Unable to get value")
                    }
                } else {
                    print("Key not found")
                }
                try await Task.sleep(for: .seconds(2))
                do {
                    try await etcdClient.set("foo", value: "updated_value")
                } catch {
                    print("Error setting updated value: \(error)")
                }
            }
        } catch {
            print("Error: \(error)")
        }
    }
}

Contributing

To contribute to this package, please look at CONTRIBUTING.md