summaryrefslogtreecommitdiffhomepage
path: root/ios/RelaySelector
diff options
context:
space:
mode:
Diffstat (limited to 'ios/RelaySelector')
-rw-r--r--ios/RelaySelector/RelaySelector.swift31
1 files changed, 29 insertions, 2 deletions
diff --git a/ios/RelaySelector/RelaySelector.swift b/ios/RelaySelector/RelaySelector.swift
index bb25c1c960..20a8496d0d 100644
--- a/ios/RelaySelector/RelaySelector.swift
+++ b/ios/RelaySelector/RelaySelector.swift
@@ -120,12 +120,37 @@ public enum RelaySelector {
)
}
+ /// Determines whether a `REST.ServerRelay` satisfies the given relay filter.
+ public static func relayMatchesFilter(_ relay: AnyRelay, filter: RelayFilter) -> Bool {
+ if case let .only(providers) = filter.providers, providers.contains(relay.provider) == false {
+ return false
+ }
+
+ switch filter.ownership {
+ case .any:
+ return true
+ case .owned:
+ return relay.owned
+ case .rented:
+ return !relay.owned
+ }
+ }
+
/// Produce a list of `RelayWithLocation` items satisfying the given constraints
private static func applyConstraints<T: AnyRelay>(
_ constraints: RelayConstraints,
relays: [RelayWithLocation<T>]
) -> [RelayWithLocation<T>] {
- relays.filter { relayWithLocation -> Bool in
+ return relays.filter { relayWithLocation -> Bool in
+ switch constraints.filter {
+ case .any:
+ break
+ case let .only(filter):
+ if !relayMatchesFilter(relayWithLocation.relay, filter: filter) {
+ return false
+ }
+ }
+
switch constraints.location {
case .any:
return true
@@ -282,9 +307,11 @@ public struct RelaySelectorResult: Codable, Equatable {
public var location: Location
}
-protocol AnyRelay {
+public protocol AnyRelay {
var hostname: String { get }
+ var owned: Bool { get }
var location: String { get }
+ var provider: String { get }
var weight: UInt64 { get }
var active: Bool { get }
var includeInCountry: Bool { get }