@@ -2,38 +2,54 @@ import Async
2
2
import Bits
3
3
import Foundation
4
4
5
- final class PostgreSQLMessageSerializer : ByteSerializer {
5
+ /// Byte-stream serializer for `PostgreSQLMessage`.
6
+ final class PostgreSQLMessageSerializer : TranslatingStream {
7
+ /// See `TranslatingStream.Input`
6
8
typealias Input = PostgreSQLMessage
9
+
10
+ /// See `TranslatingStream.Output`
7
11
typealias Output = ByteBuffer
8
12
9
- var state : ByteSerializerState < PostgreSQLMessageSerializer >
13
+ /// The internal buffer to serialize messages into.
10
14
let buffer : MutableByteBuffer
11
15
16
+ /// Excess data from a previous serialization that needs to be processed.
17
+ var excess : Data ?
18
+
19
+ /// Creates a new `PostgreSQLMessageSerializer`.
12
20
init ( bufferSize: Int = 4096 ) {
13
21
buffer = MutableByteBuffer ( start: . allocate( capacity: bufferSize) , count: bufferSize)
14
- state = . init( )
15
22
}
16
23
17
- func serialize ( _ message : PostgreSQLMessage , state : Data ? ) throws -> ByteSerializerResult < PostgreSQLMessageSerializer > {
18
- if let state = state {
19
- return serialize ( data : state )
20
- }
24
+ /// See `TranslatingStream.translate`
25
+ func translate ( input : PostgreSQLMessage ) throws -> Future < TranslatingStreamResult < ByteBuffer > > {
26
+ return try Future ( _translate ( input : input ) )
27
+ }
21
28
22
- let data = try PostgreSQLMessageEncoder ( ) . encode ( message)
23
- return serialize ( data: data)
29
+ /// Non-future implementation of `TranslatingStream.translate`
30
+ func _translate( input: PostgreSQLMessage ) throws -> TranslatingStreamResult < ByteBuffer > {
31
+ if let excess = self . excess {
32
+ self . excess = nil
33
+ return serialize ( data: excess)
34
+ } else {
35
+ let data = try PostgreSQLMessageEncoder ( ) . encode ( input)
36
+ return serialize ( data: data)
37
+ }
24
38
}
25
39
26
- func serialize ( data: Data ) -> ByteSerializerResult < PostgreSQLMessageSerializer > {
27
- print ( " serialize: \ ( data. hexDebug ) " )
40
+ /// Serializes data, storing `excess` if it does not fit in the buffer.
41
+ func serialize( data: Data ) -> TranslatingStreamResult < ByteBuffer > {
28
42
let count = data. copyBytes ( to: buffer)
29
43
let view = ByteBuffer ( start: buffer. baseAddress, count: count)
30
44
if data. count > count {
31
- return . incomplete( view, state: data [ count..< data. count] )
45
+ self . excess = data [ count..< data. count]
46
+ return . excess( view)
32
47
} else {
33
- return . complete ( view)
48
+ return . sufficient ( view)
34
49
}
35
50
}
36
51
52
+ /// Called when `PostgreSQLMessageSerializer` deinitializes.
37
53
deinit {
38
54
buffer. baseAddress? . deallocate ( capacity: buffer. count)
39
55
}
0 commit comments