diff options
| author | Fuwn <[email protected]> | 2021-03-28 15:12:32 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2021-03-28 15:12:32 +0000 |
| commit | c08d9a34680032f2477307d2ca346220df00ea5d (patch) | |
| tree | da92aebcdc34266f26bd904d4544bf5bd4b46b11 /src/server/parser.rs | |
| parent | Feature: Parse property set command (diff) | |
| download | whirl-c08d9a34680032f2477307d2ca346220df00ea5d.tar.xz whirl-c08d9a34680032f2477307d2ca346220df00ea5d.zip | |
fix: Implement parser
Fixes the problem that sometimes, commands are just skipped despite being sent from the client.
Diffstat (limited to 'src/server/parser.rs')
| -rw-r--r-- | src/server/parser.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/server/parser.rs b/src/server/parser.rs new file mode 100644 index 0000000..39065e6 --- /dev/null +++ b/src/server/parser.rs @@ -0,0 +1,37 @@ +use bytes::BytesMut; + +/// Read all commands from the given buffer. +/// +/// # Process +/// 1. Get a command from `buffer` based on first byte. +/// 2. Push command to `commands`. +/// 3. Remove command from `buffer`. +/// 4. Iterate and do this for all commands within `buffer`. +pub fn get_commands_from_buffer(mut buffer: BytesMut) -> Vec<BytesMut> { + let mut commands: Vec<BytesMut> = Vec::new(); + // debug!("initial buffer: {:?}, length: {}", buffer, buffer.len()); + + let data_length = buffer.get(0).unwrap().to_owned() as usize; + if buffer.len() > data_length { + loop { + // debug!("loop: {:?}, length: {}", buffer, buffer.len()); + let command_length = buffer.get(0).unwrap().to_owned() as usize; + commands.push( + BytesMut::from(buffer.get(0..command_length).unwrap()) + ); + + // Remove command from buffer + buffer = buffer.split_off(command_length); + + // Check if any more commands are present + if buffer.len() == 0 { break; } + } + } else { + // There will always be at least one command, push it. + commands.push( + BytesMut::from(buffer.get(0..data_length).unwrap()) + ); + } + + commands // Return command (s) +} |