@@ -114,54 +114,40 @@ class RedisResp {
114
114
private func parseByPrefix( _ buffer: inout Data , from: Int ) throws -> ( RedisResponse , Int ) {
115
115
var response : RedisResponse
116
116
117
- var ( matched, offset) = try compare ( & buffer, at: from, with: RedisResp . plus)
118
-
119
- if matched {
120
- ( response, offset) = try parseSimpleString ( & buffer, offset: offset)
121
- } else {
122
- ( matched, offset) = try compare ( & buffer, at: from, with: RedisResp . colon)
123
- if matched {
124
- ( response, offset) = try parseInteger ( & buffer, offset: offset)
125
- } else {
126
- ( matched, offset) = try compare ( & buffer, at: from, with: RedisResp . dollar)
127
- if matched {
128
- ( response, offset) = try parseBulkString ( & buffer, offset: offset)
129
- } else {
130
- ( matched, offset) = try compare ( & buffer, at: from, with: RedisResp . asterisk)
131
- if matched {
132
- ( response, offset) = try parseArray ( & buffer, offset: offset)
133
- } else {
134
- ( matched, offset) = try compare ( & buffer, at: from, with: RedisResp . minus)
135
- if matched {
136
- ( response, offset) = try parseError ( & buffer, offset: offset)
137
- } else {
138
- response = RedisResponse . Error ( " Unknown response type " )
139
- }
140
- }
141
- }
117
+ var offset = from
118
+
119
+ while offset+ 1 >= buffer. count {
120
+ let length = try socket? . read ( into: & buffer)
121
+
122
+ if length == 0 {
123
+ throw RedisRespError ( code: . EOF)
142
124
}
143
125
}
126
+
127
+ switch ( buffer [ offset..< offset+ 1 ] ) {
128
+ case RedisResp . plus:
129
+ ( response, offset) = try parseSimpleString ( & buffer, offset: offset+ 1 )
130
+ case RedisResp . colon:
131
+ ( response, offset) = try parseInteger ( & buffer, offset: offset+ 1 )
132
+ case RedisResp . dollar:
133
+ ( response, offset) = try parseBulkString ( & buffer, offset: offset+ 1 )
134
+ case RedisResp . asterisk:
135
+ ( response, offset) = try parseArray ( & buffer, offset: offset+ 1 )
136
+ case RedisResp . minus:
137
+ ( response, offset) = try parseError ( & buffer, offset: offset+ 1 )
138
+ default :
139
+ response = RedisResponse . Error ( " Unknown response type " )
140
+ }
144
141
return ( response, offset)
145
142
}
146
143
147
- /*
148
- Arrays usually need to parse bulk strings. And the longer the array, the more optimization is needed. So to save processing
149
- time, check the $ first. (https://redis.io/topics/protocol)
150
- */
151
- private func parseByPrefixArrayOptimization( _ buffer: inout Data , from: Int ) throws -> ( RedisResponse , Int ) {
152
- let ( matched, offset) = try compare ( & buffer, at: from, with: RedisResp . dollar)
153
- if matched {
154
- return try parseBulkString ( & buffer, offset: offset)
155
- }
156
- return try parseByPrefix ( & buffer, from: offset)
157
- }
158
144
private func parseArray( _ buffer: inout Data , offset: Int ) throws -> ( RedisResponse , Int ) {
159
145
var ( arrayLength, newOffset) = try parseIntegerValue ( & buffer, offset: offset)
160
146
var responses = [ RedisResponse] ( )
161
147
var response : RedisResponse
162
148
if arrayLength >= 0 {
163
149
for _ in 0 ..< Int ( arrayLength) {
164
- ( response, newOffset) = try parseByPrefixArrayOptimization ( & buffer, from: newOffset)
150
+ ( response, newOffset) = try parseByPrefix ( & buffer, from: newOffset)
165
151
responses. append ( response)
166
152
}
167
153
return ( RedisResponse . Array ( responses) , newOffset)
0 commit comments