55// Created by Coen ten Thije Boonkkamp on 28/12/2024.
66//
77
8- import Foundation
9-
108/// RFC 1035 compliant domain name
119public struct Domain : Hashable , Sendable {
1210 /// The labels that make up the domain name, from least significant to most significant
@@ -43,7 +41,7 @@ public struct Domain: Hashable, Sendable {
4341extension Domain {
4442 /// A type-safe domain label that enforces RFC 1035 rules
4543 public struct Label : Hashable , Sendable {
46- private let value : String
44+ public let value : String
4745
4846 /// Initialize a label, validating RFC 1035 rules
4947 internal init ( _ string: String ) throws {
@@ -57,15 +55,13 @@ extension Domain {
5755
5856 self . value = string
5957 }
60-
61- public var stringValue : String { value }
6258 }
6359}
6460
6561extension Domain {
6662 /// The complete domain name as a string
6763 public var name : String {
68- labels. map ( \ . stringValue ) . joined ( separator: " . " )
64+ labels. map ( String . init ) . joined ( separator: " . " )
6965 }
7066
7167 /// The top-level domain (rightmost label)
@@ -86,7 +82,7 @@ extension Domain {
8682
8783 /// Creates a subdomain by prepending new labels
8884 public func addingSubdomain( _ components: [ String ] ) throws -> Domain {
89- try Domain ( labels: components + labels. map ( \ . stringValue ) )
85+ try Domain ( labels: components + labels. map ( String . init ) )
9086 }
9187
9288 public func addingSubdomain( _ components: String ... ) throws -> Domain {
@@ -96,13 +92,13 @@ extension Domain {
9692 /// Returns the parent domain by removing the leftmost label
9793 public func parent( ) throws -> Domain ? {
9894 guard labels. count > 1 else { return nil }
99- return try Domain ( labels: labels. dropFirst ( ) . map ( \ . stringValue ) )
95+ return try Domain ( labels: labels. dropFirst ( ) . map ( String . init ) )
10096 }
10197
10298 /// Returns the root domain (tld + sld)
10399 public func root( ) throws -> Domain ? {
104100 guard labels. count >= 2 else { return nil }
105- return try Domain ( labels: labels. suffix ( 2 ) . map ( \ . stringValue ) )
101+ return try Domain ( labels: labels. suffix ( 2 ) . map ( String . init ) )
106102 }
107103}
108104
@@ -123,25 +119,11 @@ extension Domain {
123119
124120// MARK: - Errors
125121extension Domain {
126- public enum ValidationError : Error , LocalizedError , Equatable {
122+ public enum ValidationError : Error , Equatable {
127123 case empty
128124 case tooLong( _ length: Int )
129125 case tooManyLabels
130126 case invalidLabel( _ label: String )
131-
132- public var errorDescription : String ? {
133- switch self {
134- case . empty:
135- return " Domain name cannot be empty "
136- case . tooLong( let length) :
137- return " Domain name length \( length) exceeds maximum of \( Limits . maxLength) "
138- case . tooManyLabels:
139- return " Domain name has too many labels (maximum \( Limits . maxLabels) ) "
140- case . invalidLabel( let label) :
141- return
142- " Invalid label ' \( label) '. Must start with letter, end with letter/digit, and contain only letters/digits/hyphens "
143- }
144- }
145127 }
146128}
147129
0 commit comments