From 4943cbeb9dc99256fab44bc023e9dd08d529fa3b Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Tue, 23 Sep 2025 18:28:34 +0100 Subject: [PATCH] MultipartPartDecodable initialized with associatedtype Body --- .../FormDataDecoder+SingleValueContainer.swift | 2 +- Sources/MultipartKit/MultipartPartConvertible.swift | 4 ++-- Tests/MultipartKitTests/FormDataDecodingTests.swift | 2 +- Tests/MultipartKitTests/Utilities/File.swift | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/MultipartKit/FormDataDecoder/FormDataDecoder+SingleValueContainer.swift b/Sources/MultipartKit/FormDataDecoder/FormDataDecoder+SingleValueContainer.swift index fc8c9be..b7b4690 100644 --- a/Sources/MultipartKit/FormDataDecoder/FormDataDecoder+SingleValueContainer.swift +++ b/Sources/MultipartKit/FormDataDecoder/FormDataDecoder+SingleValueContainer.swift @@ -93,7 +93,7 @@ extension FormDataDecoder.Decoder: SingleValueDecodingContainer { let decoded = switch T.self { - case let multipartDecodable as any MultipartPartDecodable.Type: + case let multipartDecodable as any MultipartPartDecodable.Type: try multipartDecodable.init(multipart: part) as? T case is MultipartPart.Type: part as? T diff --git a/Sources/MultipartKit/MultipartPartConvertible.swift b/Sources/MultipartKit/MultipartPartConvertible.swift index 0dfc58b..42ebc09 100644 --- a/Sources/MultipartKit/MultipartPartConvertible.swift +++ b/Sources/MultipartKit/MultipartPartConvertible.swift @@ -6,10 +6,10 @@ public protocol MultipartPartEncodable { } /// A type that can be converted from a `MultipartPart`. -public protocol MultipartPartDecodable { +public protocol MultipartPartDecodable { associatedtype Body: MultipartPartBodyElement - init(multipart: MultipartPart) throws + init(multipart: MultipartPart) throws } /// A type that can be converted to and from a `MultipartPart`. diff --git a/Tests/MultipartKitTests/FormDataDecodingTests.swift b/Tests/MultipartKitTests/FormDataDecodingTests.swift index 7598f29..4458096 100644 --- a/Tests/MultipartKitTests/FormDataDecodingTests.swift +++ b/Tests/MultipartKitTests/FormDataDecodingTests.swift @@ -356,7 +356,7 @@ struct FormDataDecodingTests { age: 4, image: File(filename: "droplet.png", data: Array("".utf8))) - let message = ArraySlice( + let message = Array( """ --helloBoundary\r Content-Disposition: form-data; name="name"\r diff --git a/Tests/MultipartKitTests/Utilities/File.swift b/Tests/MultipartKitTests/Utilities/File.swift index 156bf7f..f21021c 100644 --- a/Tests/MultipartKitTests/Utilities/File.swift +++ b/Tests/MultipartKitTests/Utilities/File.swift @@ -4,7 +4,7 @@ struct File: Codable, Equatable, MultipartPartConvertible { typealias Body = [UInt8] let filename: String - let data: [UInt8] + let data: Body enum MultipartError: Error { case invalidFileName @@ -21,7 +21,7 @@ struct File: Codable, Equatable, MultipartPartConvertible { init(from decoder: any Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - let data = try container.decode([UInt8].self, forKey: .data) + let data = try container.decode(Body.self, forKey: .data) let filename = try container.decode(String.self, forKey: .filename) self.init(filename: filename, data: data) } @@ -32,7 +32,7 @@ struct File: Codable, Equatable, MultipartPartConvertible { try container.encode(self.filename, forKey: .filename) } - var multipart: MultipartPart<[UInt8]> { + var multipart: MultipartPart { let part = MultipartPart( headerFields: [.contentDisposition: "form-data; name=\"image\"; filename=\"\(filename)\""], body: self.data @@ -40,7 +40,7 @@ struct File: Codable, Equatable, MultipartPartConvertible { return part } - init(multipart: MultipartPart) throws { + init(multipart: MultipartPart) throws { let contentDisposition = multipart.headerFields[.contentDisposition] ?? "" let filenamePattern = "filename=\"([^\"]+)\"" let filename: String @@ -54,6 +54,6 @@ struct File: Codable, Equatable, MultipartPartConvertible { throw MultipartError.invalidFileName } - self.init(filename: filename, data: Array(multipart.body)) + self.init(filename: filename, data: multipart.body) } }