Add an Immutable Plugin protocol (#4)

* Add ab Immutable Plugin protocol

* Add missing immutable keyPath

* Clean up usage and make test for immutable plugin
This commit is contained in:
Zach 2023-02-01 17:59:14 -07:00 committed by GitHub
parent fc8c7bf385
commit 2663e6f541
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 0 deletions

View File

@ -0,0 +1,24 @@
public protocol ImmutablePlugin: Plugin where Output == Void {
/// The input value that the plugin will handle.
associatedtype Value
/// Handles the input value.
///
/// - Parameters:
/// - value: The input value that the plugin will handle.
/// - Throws: Any errors that occur during handling of the input value.
func handle(value: Value) async throws
}
extension ImmutablePlugin where Value == Input {
/// A keypath that provides access to the `immutable` property of the `Source`.
public var keyPath: WritableKeyPath<Source, ()> {
get { \.immutable }
set { }
}
public func handle(value: Value, output: inout ()) async throws {
try await handle(value: value)
}
}

View File

@ -86,4 +86,42 @@ final class PluginTests: XCTestCase {
let token = try XCTUnwrap(urlRequest.request.allHTTPHeaderFields)["auth"] let token = try XCTUnwrap(urlRequest.request.allHTTPHeaderFields)["auth"]
XCTAssertEqual(token, "token") XCTAssertEqual(token, "token")
} }
func testImmutablePlugin() async throws {
class MockService: Pluginable {
var plugins: [any Plugin] = []
}
class CountPlugin: ImmutablePlugin {
typealias Source = MockService
static let shared = CountPlugin()
var count: Int = 0
private init() {}
func handle(value: Void) async throws {
count += 1
}
}
let service = MockService()
XCTAssertEqual(service.pluginTypes, [])
service.register(
plugin: CountPlugin.shared
)
XCTAssertEqual(service.pluginTypes, ["(input: (), output: ())"])
try await service.handle(value: "Woot")
XCTAssertEqual(CountPlugin.shared.count, 0)
try await service.handle()
XCTAssertEqual(CountPlugin.shared.count, 1)
}
} }