Skip to content

Commit 481a446

Browse files
authored
Add back MultipartPartConvertible (#130)
* Add back `MultipartPartConvertible` * Add tests and fix bug
1 parent b186a55 commit 481a446

19 files changed

+169
-23
lines changed

Sources/MultipartKit/FormDataDecoder/FormDataDecoder+SingleValueContainer.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ extension FormDataDecoder.Decoder: SingleValueDecodingContainer {
9393

9494
let decoded =
9595
switch T.self {
96+
case let multipartConvertible as any MultipartPartConvertible.Type:
97+
multipartConvertible.init(multipart: part) as? T
9698
case is MultipartPart<Body>.Type:
9799
part as? T
98100
case is Data.Type:

Sources/MultipartKit/FormDataDecoder/FormDataDecoder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public struct FormDataDecoder: Sendable {
5454
_ decodable: D.Type,
5555
from buffer: Body,
5656
boundary: String
57-
) throws -> D where Body: RangeReplaceableCollection, Body.SubSequence: Equatable & Sendable {
57+
) throws -> D where Body.SubSequence: Equatable & Sendable {
5858
let parts = try MultipartParser(boundary: boundary).parse(buffer)
5959
let data = MultipartFormData(parts: parts, nestingDepth: nestingDepth)
6060
let decoder = FormDataDecoder.Decoder(codingPath: [], data: data, userInfo: userInfo)

Sources/MultipartKit/FormDataEncoder/FormDataEncoder+Encoder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
extension FormDataEncoder {
2-
struct Encoder<Body: MultipartPartBodyElement> where Body: RangeReplaceableCollection {
2+
struct Encoder<Body: MultipartPartBodyElement> {
33
let codingPath: [any CodingKey]
44
let storage = Storage<Body>()
55
let sendableUserInfo: [CodingUserInfoKey: any Sendable]

Sources/MultipartKit/FormDataEncoder/FormDataEncoder+KeyedContainer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
extension FormDataEncoder {
2-
struct KeyedContainer<Key: CodingKey, Body: MultipartPartBodyElement> where Body: RangeReplaceableCollection {
2+
struct KeyedContainer<Key: CodingKey, Body: MultipartPartBodyElement> {
33
let dataContainer = KeyedDataContainer<Body>()
44
let encoder: Encoder<Body>
55
}

Sources/MultipartKit/FormDataEncoder/FormDataEncoder+SingleValueContainer.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ extension FormDataEncoder.Encoder: SingleValueEncodingContainer {
4646

4747
func encode<T: Encodable>(_ value: T) throws {
4848
switch value {
49+
case let multipartConvertible as any MultipartPartConvertible<Body>:
50+
guard let multipart = multipartConvertible.multipart else {
51+
return try value.encode(to: self)
52+
}
53+
storage.dataContainer = SingleValueDataContainer(part: multipart)
4954
case let multipart as MultipartPart<Body>:
5055
storage.dataContainer = SingleValueDataContainer(part: multipart)
5156
case let data as Data:

Sources/MultipartKit/FormDataEncoder/FormDataEncoder+UnkeyedContainer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
extension FormDataEncoder {
2-
struct UnkeyedContainer<Body: MultipartPartBodyElement> where Body: RangeReplaceableCollection {
2+
struct UnkeyedContainer<Body: MultipartPartBodyElement> {
33
let dataContainer = UnkeyedDataContainer<Body>()
44
let encoder: FormDataEncoder.Encoder<Body>
55
}

Sources/MultipartKit/FormDataEncoder/FormDataEncoder.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,12 @@ public struct FormDataEncoder: Sendable {
4545
_ encodable: E,
4646
boundary: String,
4747
to: Body.Type = Body.self
48-
) throws -> Body where Body: RangeReplaceableCollection {
48+
) throws -> Body {
4949
let parts: [MultipartPart<Body>] = try self.parts(from: encodable)
5050
return MultipartSerializer(boundary: boundary).serialize(parts: parts)
5151
}
5252

53-
private func parts<E: Encodable, Body: MultipartPartBodyElement>(from encodable: E) throws -> [MultipartPart<Body>]
54-
where Body: RangeReplaceableCollection {
53+
private func parts<E: Encodable, Body: MultipartPartBodyElement>(from encodable: E) throws -> [MultipartPart<Body>] {
5554
let encoder = Encoder<Body>(codingPath: [], userInfo: userInfo)
5655
try encodable.encode(to: encoder)
5756
return encoder.storage.data?.namedParts() ?? []

Sources/MultipartKit/MultipartParser+parse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import HTTPTypes
22

33
extension MultipartParser {
44
/// Synchronously parse the multipart data into an array of ``MultipartPart``.
5-
public func parse(_ data: Body) throws -> [MultipartPart<Body>] where Body: RangeReplaceableCollection {
5+
public func parse(_ data: Body) throws -> [MultipartPart<Body>] {
66
var output: [MultipartPart<Body>] = []
77
var parser = MultipartParser(boundary: self.boundary)
88

Sources/MultipartKit/MultipartParser.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import HTTPTypes
22

33
/// Parses any kind of multipart encoded data into ``MultipartSection``s.
4-
public struct MultipartParser<Body: MultipartPartBodyElement> where Body: RangeReplaceableCollection {
4+
public struct MultipartParser<Body: MultipartPartBodyElement> {
55
enum State: Equatable {
66
enum Part: Equatable {
77
case boundary

Sources/MultipartKit/MultipartParserAsyncSequence.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import HTTPTypes
2828
/// ```
2929
///
3030
public struct MultipartParserAsyncSequence<BackingSequence: AsyncSequence>: AsyncSequence
31-
where BackingSequence.Element: MultipartPartBodyElement & RangeReplaceableCollection {
31+
where BackingSequence.Element: MultipartPartBodyElement {
3232
let streamingSequence: StreamingMultipartParserAsyncSequence<BackingSequence>
3333

3434
public init(boundary: String, buffer: BackingSequence) {

0 commit comments

Comments
 (0)