Try to parse a complete RESP frame from the buffer. Returns `Ok(Some(value))` if a complete frame was parsed (consumed from buffer). Returns `Ok(None)` if more data is needed. Returns `Err` on protocol errors.
(&mut self)
| 144 | /// Returns `Ok(None)` if more data is needed. |
| 145 | /// Returns `Err` on protocol errors. |
| 146 | pub fn try_parse(&mut self) -> io::Result<Option<RespValue>> { |
| 147 | if self.buf.is_empty() { |
| 148 | return Ok(None); |
| 149 | } |
| 150 | |
| 151 | match self.buf[0] { |
| 152 | b'+' | b'-' | b':' | b'$' | b'*' => { |
| 153 | let (value, consumed) = match parse_value(&self.buf) { |
| 154 | Ok(Some((v, n))) => (v, n), |
| 155 | Ok(None) => return Ok(None), |
| 156 | Err(e) => return Err(e), |
| 157 | }; |
| 158 | self.buf.drain(..consumed); |
| 159 | Ok(Some(value)) |
| 160 | } |
| 161 | // Inline command: plain text terminated by \r\n or \n. |
| 162 | _ => { |
| 163 | if let Some(pos) = find_line_end(&self.buf) { |
| 164 | let line = &self.buf[..pos]; |
| 165 | let parts = parse_inline_command(line); |
| 166 | let consumed = if self.buf.get(pos + 1) == Some(&b'\n') { |
| 167 | pos + 2 |
| 168 | } else { |
| 169 | pos + 1 |
| 170 | }; |
| 171 | self.buf.drain(..consumed); |
| 172 | Ok(Some(parts)) |
| 173 | } else { |
| 174 | Ok(None) // Need more data. |
| 175 | } |
| 176 | } |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | /// Number of bytes in the parser buffer (for backpressure). |
| 181 | pub fn buffered(&self) -> usize { |