diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2019-12-03 16:54:48 +0100 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2019-12-04 12:39:35 +0100 |
| commit | b636ab0d9e8df4dc85e03070edb4f4e70f9ce43d (patch) | |
| tree | 3e3b86e6838cb1f6052d14b4382d909ff241ad8b | |
| parent | b15317f6b8249ae82140662a1b3e52b54c80f858 (diff) | |
| download | mullvadvpn-b636ab0d9e8df4dc85e03070edb4f4e70f9ce43d.tar.xz mullvadvpn-b636ab0d9e8df4dc85e03070edb4f4e70f9ce43d.zip | |
Migrate to RelayList v3
| -rw-r--r-- | ios/MullvadVPN/RelayList.swift | 70 |
1 files changed, 51 insertions, 19 deletions
diff --git a/ios/MullvadVPN/RelayList.swift b/ios/MullvadVPN/RelayList.swift index 8601572af8..fc892cd269 100644 --- a/ios/MullvadVPN/RelayList.swift +++ b/ios/MullvadVPN/RelayList.swift @@ -12,37 +12,69 @@ import Network struct RelayList: Codable { struct Country: Codable { - let name: String - let code: String - let cities: [City] + var name: String + var code: String + var cities: [City] } struct City: Codable { - let name: String - let code: String - let latitude: Double - let longitude: Double - let relays: [Hostname] + var name: String + var code: String + var latitude: Double + var longitude: Double + var relays: [Hostname] } struct Hostname: Codable { - let hostname: String - let ipv4AddrIn: IPv4Address - let includeInCountry: Bool - let weight: Int32 - let tunnels: Tunnels? + var hostname: String + var ipv4AddrIn: IPv4Address + var includeInCountry: Bool + var active: Bool + var weight: Int32 + var tunnels: Tunnels? } struct Tunnels: Codable { - let wireguard: [WireguardTunnel]? + var wireguard: [WireguardTunnel]? } struct WireguardTunnel: Codable { - let ipv4Gateway: IPv4Address - let ipv6Gateway: IPv6Address - let publicKey: Data - let portRanges: [ClosedRange<UInt16>] + var ipv4Gateway: IPv4Address + var ipv6Gateway: IPv6Address + var publicKey: Data + var portRanges: [ClosedRange<UInt16>] + } + + var countries: [Country] +} + +extension RelayList { + + /// Returns an alphabetically sorted `RelayList` + func sorted() -> Self { + let lexicalComparator = { (a: String, b: String) -> Bool in + return a.localizedCaseInsensitiveCompare(b) == .orderedAscending + } + + let fileComparator = { (a: String, b: String) -> Bool in + return a.localizedStandardCompare(b) == .orderedAscending + } + + let sortedCountries = countries + .sorted { lexicalComparator($0.name, $1.name) } + .map { (country) -> RelayList.Country in + var sortedCountry = country + sortedCountry.cities = country.cities.sorted { lexicalComparator($0.name, $1.name) } + .map({ (city) -> RelayList.City in + var sortedCity = city + sortedCity.relays = city.relays + .sorted { fileComparator($0.hostname, $1.hostname) } + return sortedCity + }) + return sortedCountry + } + + return RelayList(countries: sortedCountries) } - let countries: [Country] } |
