From 8ec73025f2216e5c4c7e4170582cb2e4a16fd06d Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Fri, 19 Oct 2018 09:15:37 +0530 Subject: [PATCH] Model: IPAddressRange: Converting to and from String Signed-off-by: Roopesh Chander --- .../WireGuard/Model/IPAddressRange.swift | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/WireGuard/WireGuard/Model/IPAddressRange.swift b/WireGuard/WireGuard/Model/IPAddressRange.swift index 4498b58..ca4a7b9 100644 --- a/WireGuard/WireGuard/Model/IPAddressRange.swift +++ b/WireGuard/WireGuard/Model/IPAddressRange.swift @@ -15,6 +15,37 @@ struct IPAddressRange { var networkPrefixLength: UInt8 } +// MARK: Converting to and from String +// For use in the UI + +extension IPAddressRange { + init?(from string: String) { + guard let indexOfSlash = string.lastIndex(of: "/") else { return nil } + let indexOfNetworkPrefixLength = string.index(after: indexOfSlash) + guard (indexOfNetworkPrefixLength < string.endIndex) else { return nil } + let addressString = String(string[string.startIndex ..< indexOfSlash]) + if let addr = IPv4Address(addressString) { + address = addr + } else if let addr = IPv6Address(addressString) { + address = addr + } else { + return nil + } + let networkPrefixLengthSubstring = string[indexOfNetworkPrefixLength ..< string.endIndex] + if let npl = UInt8(networkPrefixLengthSubstring) { + networkPrefixLength = npl + } else { + return nil + } + } + func stringRepresentation() -> String { + return "\(address)/\(networkPrefixLength)" + } +} + +// MARK: Codable +// For serializing to disk + @available(OSX 10.14, iOS 12.0, *) extension IPAddressRange: Codable { public func encode(to encoder: Encoder) throws {