From 7863b166a16a46bf201c9fa18aad27434dfcb890 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 8 Dec 2025 14:27:42 +0900 Subject: [PATCH] Preallocate a few more response parsers --- src/commands/audio_output_devices/outputs.rs | 7 +++++-- src/commands/connection_settings/protocol_disable.rs | 2 +- src/commands/connection_settings/protocol_enable.rs | 2 +- src/commands/stickers/stickernamestypes.rs | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/commands/audio_output_devices/outputs.rs b/src/commands/audio_output_devices/outputs.rs index b1ec470..a9c978a 100644 --- a/src/commands/audio_output_devices/outputs.rs +++ b/src/commands/audio_output_devices/outputs.rs @@ -34,7 +34,10 @@ impl CommandResponse for OutputsResponse { } fn parse(parts: ResponseAttributes<'_>) -> Result { - let mut outputs = Vec::new(); + let parts = parts.into_vec()?; + + let result_len = parts.iter().filter(|(k, _)| *k == "outputid").count(); + let mut outputs = Vec::with_capacity(result_len); let mut id: Option = None; let mut name: Option = None; @@ -42,7 +45,7 @@ impl CommandResponse for OutputsResponse { let mut enabled: Option = None; let mut attributes: HashMap = HashMap::new(); - for (k, v) in parts.into_vec()?.into_iter() { + for (k, v) in parts.into_iter() { match k { "outputid" => { // Reset and store the previous output if all fields are present diff --git a/src/commands/connection_settings/protocol_disable.rs b/src/commands/connection_settings/protocol_disable.rs index a8b26a3..e216ce9 100644 --- a/src/commands/connection_settings/protocol_disable.rs +++ b/src/commands/connection_settings/protocol_disable.rs @@ -38,7 +38,7 @@ impl CommandRequest for ProtocolDisableRequest { return Err(RequestParserError::UnexpectedEOF); } - let mut features = Vec::new(); + let mut features = Vec::with_capacity(parts.size_hint().0); for part in parts { let feature = part .parse() diff --git a/src/commands/connection_settings/protocol_enable.rs b/src/commands/connection_settings/protocol_enable.rs index 2bd5b4a..105d500 100644 --- a/src/commands/connection_settings/protocol_enable.rs +++ b/src/commands/connection_settings/protocol_enable.rs @@ -38,7 +38,7 @@ impl CommandRequest for ProtocolEnableRequest { return Err(RequestParserError::UnexpectedEOF); } - let mut features = Vec::new(); + let mut features = Vec::with_capacity(parts.size_hint().0); for part in parts { let feature = part .parse() diff --git a/src/commands/stickers/stickernamestypes.rs b/src/commands/stickers/stickernamestypes.rs index b0bff5b..0314a04 100644 --- a/src/commands/stickers/stickernamestypes.rs +++ b/src/commands/stickers/stickernamestypes.rs @@ -68,7 +68,8 @@ impl CommandResponse for StickerNamesTypesResponse { fn parse(parts: ResponseAttributes<'_>) -> Result { let parts: Vec<_> = parts.into_vec()?; - let mut result = HashMap::new(); + debug_assert!(parts.len() % 2 == 0); + let mut result = HashMap::with_capacity(parts.len() / 2); for name_type_pair in parts.chunks_exact(2) { // TODO: don't depend on order, just make sure we have both