diff options
Diffstat (limited to 'ios/RelaySelector')
| -rw-r--r-- | ios/RelaySelector/RelaySelector.swift | 31 |
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 } |
