From 9a44d97951e4c89fd16d8da1c2c189ac951f4e2c Mon Sep 17 00:00:00 2001 From: Brandon Sneed Date: Mon, 20 Nov 2023 10:45:15 -0800 Subject: [PATCH] Expanded plugin`find` capabilities. --- Sources/Segment/Plugins.swift | 12 +++++++++++ Sources/Segment/Timeline.swift | 12 +++++++++++ Tests/Segment-Tests/Analytics_Tests.swift | 25 +++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/Sources/Segment/Plugins.swift b/Sources/Segment/Plugins.swift index cf0086f3..9ce104c9 100644 --- a/Sources/Segment/Plugins.swift +++ b/Sources/Segment/Plugins.swift @@ -156,6 +156,14 @@ extension DestinationPlugin { timeline.remove(plugin: plugin) } + public func find(pluginType: T.Type) -> T? { + return timeline.find(pluginType: pluginType) + } + + public func findAll(pluginType: T.Type) -> [T]? { + return timeline.findAll(pluginType: pluginType) + } + } extension Analytics { @@ -212,6 +220,10 @@ extension Analytics { return timeline.find(pluginType: pluginType) } + public func findAll(pluginType: T.Type) -> [T]? { + return timeline.findAll(pluginType: pluginType) + } + public func find(key: String) -> DestinationPlugin? { return timeline.find(key: key) } diff --git a/Sources/Segment/Timeline.swift b/Sources/Segment/Timeline.swift index b6b17019..063c4366 100644 --- a/Sources/Segment/Timeline.swift +++ b/Sources/Segment/Timeline.swift @@ -136,6 +136,18 @@ extension Timeline { return found.first as? T } + internal func findAll(pluginType: T.Type) -> [T]? { + var found = [Plugin]() + for type in PluginType.allCases { + if let mediator = plugins[type] { + found.append(contentsOf: mediator.plugins.filter { (plugin) -> Bool in + return plugin is T + }) + } + } + return found as? [T] + } + internal func find(key: String) -> DestinationPlugin? { var found = [Plugin]() if let mediator = plugins[.destination] { diff --git a/Tests/Segment-Tests/Analytics_Tests.swift b/Tests/Segment-Tests/Analytics_Tests.swift index 64fb1b44..895262d7 100644 --- a/Tests/Segment-Tests/Analytics_Tests.swift +++ b/Tests/Segment-Tests/Analytics_Tests.swift @@ -754,4 +754,29 @@ final class Analytics_Tests: XCTestCase { // it's running in sync mode. XCTAssertEqual(analytics.pendingUploads!.count, 0) } + + func testFindAll() { + let analytics = Analytics(configuration: Configuration(writeKey: "testFindAll") + .flushInterval(9999) + .flushAt(9999) + .operatingMode(.synchronous)) + + analytics.add(plugin: ZiggyPlugin()) + analytics.add(plugin: ZiggyPlugin()) + analytics.add(plugin: ZiggyPlugin()) + + let myDestination = MyDestination() + myDestination.add(plugin: GooberPlugin()) + myDestination.add(plugin: GooberPlugin()) + + analytics.add(plugin: myDestination) + + waitUntilStarted(analytics: analytics) + + let ziggysFound = analytics.findAll(pluginType: ZiggyPlugin.self) + let goobersFound = myDestination.findAll(pluginType: GooberPlugin.self) + + XCTAssertEqual(ziggysFound!.count, 3) + XCTAssertEqual(goobersFound!.count, 2) + } }