16
16
import struct NIO. ByteBuffer
17
17
18
18
@available ( macOS 12 , iOS 15 , tvOS 15 , watchOS 8 , * )
19
- public struct ByteBufferToUInt8AsyncSequence < Upstream: AsyncSequence > : AsyncSequence where Upstream. Element == ByteBuffer {
19
+ public struct NIOByteBufferToUInt8AsyncSequence < Upstream: AsyncSequence > : AsyncSequence where Upstream. Element == ByteBuffer {
20
20
public typealias Element = UInt8
21
21
public typealias AsyncIterator = Iterator
22
22
23
+ @usableFromInline
24
+ let upstream : Upstream
25
+
26
+ @inlinable
27
+ init ( _ upstream: Upstream ) {
28
+ self . upstream = upstream
29
+ }
30
+
31
+ @inlinable
32
+ public func makeAsyncIterator( ) -> Iterator {
33
+ Iterator ( self . upstream. makeAsyncIterator ( ) )
34
+ }
35
+
23
36
public struct Iterator: AsyncIteratorProtocol {
24
37
/*private but*/ @usableFromInline var state : State
25
38
@@ -28,87 +41,74 @@ public struct ByteBufferToUInt8AsyncSequence<Upstream: AsyncSequence>: AsyncSequ
28
41
case hasBuffer( ByteBuffer , Upstream . AsyncIterator )
29
42
case askForMore( Upstream . AsyncIterator )
30
43
case finished
31
- case modifying
44
+
45
+ @inlinable
46
+ init ( buffer: ByteBuffer , upstream: Upstream . AsyncIterator ) {
47
+ if buffer. readableBytes > 0 {
48
+ self = . hasBuffer( buffer, upstream)
49
+ } else {
50
+ self = . askForMore( upstream)
51
+ }
52
+ }
53
+
54
+ @inlinable
55
+ mutating func next( ) async throws -> Element ? {
56
+ switch self {
57
+ case . askForMore( var upstream) :
58
+ while true {
59
+ switch try await upstream. next ( ) {
60
+ case . some ( let nextBuffer) where nextBuffer. readableBytes == 0 :
61
+ // we received an empty buffer. for this reason, let's continue and get the
62
+ // next buffer fro, the sequence
63
+ continue
64
+
65
+ case . some ( var nextBuffer) :
66
+ assert ( nextBuffer. readableBytes > 0 )
67
+ let result = nextBuffer. readInteger ( as: UInt8 . self)
68
+ self = . init( buffer: nextBuffer, upstream: upstream)
69
+ return result
70
+
71
+ case . none:
72
+ self = . finished
73
+ return nil
74
+ }
75
+ }
76
+
77
+ case . hasBuffer ( var buffer, let upstream) :
78
+ assert( buffer. readableBytes > 0 )
79
+ let result = buffer. readInteger ( as: UInt8 . self)
80
+ self = . init( buffer: buffer, upstream: upstream)
81
+ return result
82
+
83
+ case . finished:
84
+ return nil
85
+ }
86
+ }
32
87
}
33
88
34
- @usableFromInline
89
+ @inlinable
35
90
init( _ upstream: Upstream . AsyncIterator) {
36
91
self . state = . askForMore( upstream)
37
92
}
38
93
39
94
@inlinable
40
95
public mutating func next( ) async throws -> Element? {
41
- switch self . state {
42
- case . askForMore( var upstream) :
43
- self . state = . modifying
44
-
45
- while true {
46
- switch try await upstream. next ( ) {
47
- case . some ( let nextBuffer) where nextBuffer. readableBytes == 0 :
48
- break
49
-
50
- case . some ( var nextBuffer) :
51
- assert ( nextBuffer. readableBytes > 0 )
52
- let result = nextBuffer. readInteger ( as: UInt8 . self)
53
- if nextBuffer. readableBytes > 0 {
54
- self . state = . hasBuffer( nextBuffer, upstream)
55
- } else {
56
- self . state = . askForMore( upstream)
57
- }
58
- return result
59
-
60
- case . none:
61
- self . state = . finished
62
- return nil
63
- }
64
- }
65
-
66
- case . hasBuffer ( var buffer, let upstream) :
67
- assert( buffer. readableBytes > 0 )
68
- self. state = . modifying
69
-
70
- let result = buffer. readInteger ( as: UInt8 . self)
71
- if buffer. readableBytes > 0 {
72
- self . state = . hasBuffer( buffer, upstream)
73
- } else {
74
- self . state = . askForMore( upstream)
75
- }
76
- return result
77
-
78
- case . finished:
79
- return nil
80
-
81
- case . modifying :
82
- preconditionFailure( " Invalid state: \( self . state) " )
83
- }
96
+ try await self . state. next ( )
84
97
}
85
98
}
86
99
87
- @inlinable
88
- public func makeAsyncIterator( ) - > Iterator {
89
- Iterator ( self . upstream. makeAsyncIterator ( ) )
90
- }
91
-
92
- @usableFromInline
93
- let upstream: Upstream
94
-
95
- /*private but*/ @usableFromInline init( _ upstream: Upstream) {
96
- self . upstream = upstream
97
- }
98
100
}
99
101
100
- @usableFromInline
101
- struct TooManyBytesError: Error {
102
- @usableFromInline
103
- init( ) { }
102
+ public struct NIOTooManyBytesError: Error {
103
+ public init( ) { }
104
104
}
105
105
106
106
@available ( macOS 12 , iOS 15 , tvOS 15 , watchOS 8 , * )
107
107
extension AsyncSequence where Element == ByteBuffer {
108
108
/// Transform an AsyncSequence of ByteBuffers into an AsyncSequence of single bytes.
109
109
@inlinable
110
- public func toBytes( ) -> ByteBufferToUInt8AsyncSequence < Self > {
111
- ByteBufferToUInt8AsyncSequence ( self )
110
+ public func toBytes( ) -> NIOByteBufferToUInt 8 AsyncSequence < Self> {
111
+ NIOByteBufferToUInt 8 AsyncSequence ( self)
112
112
}
113
113
114
114
/// Consume an ``Swift/AsyncSequence`` of ``NIO/ByteBuffer``s into a single `ByteBuffer`.
@@ -124,13 +124,13 @@ extension AsyncSequence where Element == ByteBuffer {
124
124
125
125
var receivedBytes = buffer. readableBytes
126
126
if receivedBytes > maxBytes {
127
- throw TooManyBytesError ( )
127
+ throw NIOTooManyBytesError ( )
128
128
}
129
129
130
130
while var next = try await iterator. next ( ) {
131
131
receivedBytes += next. readableBytes
132
132
if receivedBytes > maxBytes {
133
- throw TooManyBytesError ( )
133
+ throw NIOTooManyBytesError ( )
134
134
}
135
135
136
136
buffer. writeBuffer ( & next)
0 commit comments