Skip to content

Commit 1a23c81

Browse files
authored
Make Builder's interface simple (Kuniwak#4)
1 parent 06fb139 commit 1a23c81

11 files changed

+144
-184
lines changed

README.md

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ Basic Usage
1414
-----------
1515

1616
```swift
17-
let result = MultipartFormData.Builder(
18-
generatingBoundaryBy: RandomBoundaryGenerator()
19-
)
20-
.build(with: [
17+
let multipartFormData = try MultipartFormData.Builder.build(
18+
with: [
2119
(
2220
name: "example1",
2321
filename: nil,
@@ -30,22 +28,17 @@ let result = MultipartFormData.Builder(
3028
mimeType: MIMEType.textPlain,
3129
data: "EXAMPLE_TXT".data(using: .utf8)!
3230
),
33-
])
34-
35-
36-
switch result {
37-
case let .valid(multipartFormData):
38-
var requrst = URLRequest(url: URL(string: "http://example.com")!)
39-
request.addValue(multipartFormData.contentType, forHTTPHeaderField: "Content-Type")
40-
request.httpBody = multipartFormData.body
31+
],
32+
willSeparateBy: RandomBoundaryGenerator.generate()
33+
)
4134

42-
let task = URLSession.shared.dataTask(with: request)
43-
task.resume()
35+
var request = URLRequest(url: URL(string: "http://example.com")!)
36+
request.httpMethod = "POST"
37+
request.setValue(multipartFormData.contentType, forHTTPHeaderField: "Content-Type")
38+
request.httpBody = multipartFormData.body
4439

45-
case let .invalid(because: error):
46-
print(error)
47-
return
48-
}
40+
let task = URLSession.shared.dataTask(with: request)
41+
task.resume()
4942
```
5043

5144

@@ -59,15 +52,15 @@ let multipartFormData = MultipartFormData(
5952
body: [
6053
MultipartFormData.Part(
6154
contentDisposition: ContentDisposition(
62-
name: Name(asPercentEncoded: "field1"),
55+
name: Name(asPercentEncoded: "field%201"),
6356
filename: nil
6457
),
6558
contentType: nil,
6659
content: "value1".data(using: .utf8)!
6760
),
6861
MultipartFormData.Part(
6962
contentDisposition: ContentDisposition(
70-
name: Name(asPercentEncoded: "field2"),
63+
name: Name(asPercentEncoded: "field%202"),
7164
filename: Filename(asPercentEncoded: "example.txt")
7265
),
7366
contentType: ContentType(representing: .textPlain),

Sources/MultipartFormDataKit/BoundaryGenerator.swift

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,13 @@ import Foundation
33

44

55
public protocol BoundaryGenerator {
6-
func generate() -> String
7-
}
8-
9-
10-
11-
public class ConstantBoundaryGenerator: BoundaryGenerator {
12-
private let boundary: String
13-
14-
15-
public init(willReturn boundary: String) {
16-
self.boundary = boundary
17-
}
18-
19-
20-
public func generate() -> String {
21-
return self.boundary
22-
}
6+
static func generate() -> String
237
}
248

259

2610

2711
public class RandomBoundaryGenerator: BoundaryGenerator {
28-
public init() {}
29-
30-
31-
public func generate() -> String {
12+
public static func generate() -> String {
3213
return String(format: "%08x%08x", arc4random(), arc4random())
3314
}
3415
}

Sources/MultipartFormDataKit/ContentDisposition.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public struct ContentDisposition {
109109

110110

111111

112-
public enum DataTransformError {
112+
public enum DataTransformError: Error {
113113
case cannotEncodeAsUTF8(debugInfo: String)
114114
}
115115
}

Sources/MultipartFormDataKit/ContentType.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public struct ContentType {
7878

7979

8080

81-
public enum DataTransformError {
81+
public enum DataTransformError: Error {
8282
case cannotEncodeAsUTF8(debugInfo: String)
8383
}
8484
}

Sources/MultipartFormDataKit/Filename.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public struct Filename {
3737
}
3838

3939

40-
public enum FailureReason {
40+
public enum FailureReason: Error {
4141
case cannotPercentEncode(debugInfo: String)
4242
}
4343
}

Sources/MultipartFormDataKit/MultipartFormData+Builder.swift

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,47 @@ import Foundation
33

44

55
extension MultipartFormData {
6-
public class Builder {
7-
public typealias Part = (
8-
name: String,
9-
filename: String?,
10-
mimeType: MIMEType?,
11-
data: Data
12-
)
13-
14-
private let boundaryGenerator: BoundaryGenerator
15-
16-
17-
public init(generatingBoundaryBy boundaryGenerator: BoundaryGenerator) {
18-
self.boundaryGenerator = boundaryGenerator
6+
public typealias PartParam = (
7+
name: String,
8+
filename: String?,
9+
mimeType: MIMEType?,
10+
data: Data
11+
)
12+
13+
14+
15+
public enum Builder {
16+
public static func build(
17+
with partParams: [PartParam],
18+
willSeparateBy uniqueBoundary: String
19+
) throws -> BuildResult {
20+
switch TypedBuilder.build(with: partParams, willSeparateBy: uniqueBoundary) {
21+
case let .invalid(because: error):
22+
throw error
23+
24+
case let .valid(result):
25+
return result
26+
}
1927
}
28+
}
2029

2130

2231

23-
public func build(
24-
with parts: [Part]
32+
public enum TypedBuilder {
33+
public static func build(
34+
with partParams: [PartParam],
35+
willSeparateBy uniqueBoundary: String
2536
) -> ValidationResult<BuildResult, BuildError> {
26-
let uniqueBoundary = self.boundaryGenerator.generate()
27-
2837
var validParts = [MultipartFormData.Part]()
29-
for part in parts {
38+
for partParam in partParams {
3039
switch MultipartFormData.Part.create(
31-
name: part.name,
32-
filename: part.filename,
33-
mimeType: part.mimeType,
34-
data: part.data
40+
name: partParam.name,
41+
filename: partParam.filename,
42+
mimeType: partParam.mimeType,
43+
data: partParam.data
3544
) {
36-
case let .valid(validPart):
37-
validParts.append(validPart)
45+
case let .valid(part):
46+
validParts.append(part)
3847

3948
case let .invalid(because: reason):
4049
return .invalid(because: .partCreationError(reason))
@@ -57,33 +66,36 @@ extension MultipartFormData {
5766
return .invalid(because: .dataTransformError(reason))
5867
}
5968
}
69+
}
6070

6171

6272

63-
public enum BuildError {
64-
case partCreationError(MultipartFormData.Part.CreationError)
65-
case dataTransformError(MultipartFormData.DataTransformError)
66-
}
73+
public enum BuildError: Error {
74+
case partCreationError(MultipartFormData.Part.CreationError)
75+
case dataTransformError(MultipartFormData.DataTransformError)
76+
}
6777

6878

6979

70-
public struct BuildResult {
71-
public let contentType: String
72-
public let body: Data
80+
public struct BuildResult {
81+
public let contentType: String
82+
public let body: Data
7383

7484

75-
public init(contentType: String, body: Data) {
76-
self.contentType = contentType
77-
self.body = body
78-
}
85+
public init(contentType: String, body: Data) {
86+
self.contentType = contentType
87+
self.body = body
7988
}
8089
}
8190
}
8291

8392

8493

85-
extension MultipartFormData.Builder.BuildResult: Equatable {
86-
public static func ==(lhs: MultipartFormData.Builder.BuildResult, rhs: MultipartFormData.Builder.BuildResult) -> Bool {
94+
extension MultipartFormData.BuildResult: Equatable {
95+
public static func ==(
96+
lhs: MultipartFormData.BuildResult,
97+
rhs: MultipartFormData.BuildResult
98+
) -> Bool {
8799
return lhs.contentType == rhs.contentType
88100
&& lhs.body == rhs.body
89101
}

Sources/MultipartFormDataKit/MultipartFormData+Part.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ extension MultipartFormData {
134134

135135

136136

137-
public enum CreationError {
137+
public enum CreationError: Error {
138138
case invalidName(Name.FailureReason)
139139
case invalidFilename(Filename.FailureReason)
140140
}

Sources/MultipartFormDataKit/MultipartFormData.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public struct MultipartFormData {
7979

8080

8181

82-
public enum DataTransformError {
82+
public enum DataTransformError: Error {
8383
case contentDispositionError(ContentDisposition.DataTransformError)
8484
case contentTypeError(ContentType.DataTransformError)
8585
case boundaryError(debugInfo: String)

Sources/MultipartFormDataKit/Name.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public struct Name {
2020
}
2121

2222

23-
public enum FailureReason {
23+
public enum FailureReason: Error {
2424
case cannotPercentEncode(debugInfo: String)
2525
}
2626
}

0 commit comments

Comments
 (0)