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