diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index ff68641c34b96c18b17c96618aff127fec12cc39..32fba409582d187cc71b529e130338bc5abe91b8 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -20,13 +20,13 @@ use tokio::sync::RwLock; use tracing_subscriber::EnvFilter; -pub(super) async fn echo(_body: Vec<&str>, message: Vec<String>) -> Result<RoomMessageEventContent> { +pub(super) async fn echo(_body: &[&str], message: Vec<String>) -> Result<RoomMessageEventContent> { let message = message.join(" "); Ok(RoomMessageEventContent::notice_plain(message)) } -pub(super) async fn get_auth_chain(_body: Vec<&str>, event_id: Box<EventId>) -> Result<RoomMessageEventContent> { +pub(super) async fn get_auth_chain(_body: &[&str], event_id: Box<EventId>) -> Result<RoomMessageEventContent> { let event_id = Arc::<EventId>::from(event_id); if let Some(event) = services().rooms.timeline.get_pdu_json(&event_id)? { let room_id_str = event @@ -52,7 +52,7 @@ pub(super) async fn get_auth_chain(_body: Vec<&str>, event_id: Box<EventId>) -> } } -pub(super) async fn parse_pdu(body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn parse_pdu(body: &[&str]) -> Result<RoomMessageEventContent> { if body.len() < 2 || !body[0].trim().starts_with("```") || body.last().unwrap_or(&"").trim() != "```" { return Ok(RoomMessageEventContent::text_plain( "Expected code block in command body. Add --help for details.", @@ -80,7 +80,7 @@ pub(super) async fn parse_pdu(body: Vec<&str>) -> Result<RoomMessageEventContent } } -pub(super) async fn get_pdu(_body: Vec<&str>, event_id: Box<EventId>) -> Result<RoomMessageEventContent> { +pub(super) async fn get_pdu(_body: &[&str], event_id: Box<EventId>) -> Result<RoomMessageEventContent> { let mut outlier = false; let mut pdu_json = services() .rooms @@ -108,7 +108,7 @@ pub(super) async fn get_pdu(_body: Vec<&str>, event_id: Box<EventId>) -> Result< } pub(super) async fn get_remote_pdu_list( - body: Vec<&str>, server: Box<ServerName>, force: bool, + body: &[&str], server: Box<ServerName>, force: bool, ) -> Result<RoomMessageEventContent> { if !services().globals.config.allow_federation { return Ok(RoomMessageEventContent::text_plain( @@ -130,14 +130,15 @@ pub(super) async fn get_remote_pdu_list( } let list = body - .clone() - .drain(1..body.len().checked_sub(1).unwrap()) + .iter() + .collect::<Vec<_>>() + .drain(1..body.len().saturating_sub(1)) .filter_map(|pdu| EventId::parse(pdu).ok()) .collect::<Vec<_>>(); for pdu in list { if force { - if let Err(e) = get_remote_pdu(Vec::new(), Box::from(pdu), server.clone()).await { + if let Err(e) = get_remote_pdu(&[], Box::from(pdu), server.clone()).await { services() .admin .send_message(RoomMessageEventContent::text_plain(format!( @@ -147,7 +148,7 @@ pub(super) async fn get_remote_pdu_list( warn!(%e, "Failed to get remote PDU, ignoring error"); } } else { - get_remote_pdu(Vec::new(), Box::from(pdu), server.clone()).await?; + get_remote_pdu(&[], Box::from(pdu), server.clone()).await?; } } @@ -155,7 +156,7 @@ pub(super) async fn get_remote_pdu_list( } pub(super) async fn get_remote_pdu( - _body: Vec<&str>, event_id: Box<EventId>, server: Box<ServerName>, + _body: &[&str], event_id: Box<EventId>, server: Box<ServerName>, ) -> Result<RoomMessageEventContent> { if !services().globals.config.allow_federation { return Ok(RoomMessageEventContent::text_plain( @@ -240,7 +241,7 @@ pub(super) async fn get_remote_pdu( } } -pub(super) async fn get_room_state(_body: Vec<&str>, room: OwnedRoomOrAliasId) -> Result<RoomMessageEventContent> { +pub(super) async fn get_room_state(_body: &[&str], room: OwnedRoomOrAliasId) -> Result<RoomMessageEventContent> { let room_id = services().rooms.alias.resolve(&room).await?; let room_state = services() .rooms @@ -267,7 +268,7 @@ pub(super) async fn get_room_state(_body: Vec<&str>, room: OwnedRoomOrAliasId) - Ok(RoomMessageEventContent::notice_markdown(format!("```json\n{json}\n```"))) } -pub(super) async fn ping(_body: Vec<&str>, server: Box<ServerName>) -> Result<RoomMessageEventContent> { +pub(super) async fn ping(_body: &[&str], server: Box<ServerName>) -> Result<RoomMessageEventContent> { if server == services().globals.server_name() { return Ok(RoomMessageEventContent::text_plain( "Not allowed to send federation requests to ourselves.", @@ -305,7 +306,7 @@ pub(super) async fn ping(_body: Vec<&str>, server: Box<ServerName>) -> Result<Ro } } -pub(super) async fn force_device_list_updates(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn force_device_list_updates(_body: &[&str]) -> Result<RoomMessageEventContent> { // Force E2EE device list updates for all users for user_id in services().users.iter().filter_map(Result::ok) { services().users.mark_device_key_update(&user_id)?; @@ -316,7 +317,7 @@ pub(super) async fn force_device_list_updates(_body: Vec<&str>) -> Result<RoomMe } pub(super) async fn change_log_level( - _body: Vec<&str>, filter: Option<String>, reset: bool, + _body: &[&str], filter: Option<String>, reset: bool, ) -> Result<RoomMessageEventContent> { let handles = &["console"]; @@ -380,7 +381,7 @@ pub(super) async fn change_log_level( Ok(RoomMessageEventContent::text_plain("No log level was specified.")) } -pub(super) async fn sign_json(body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn sign_json(body: &[&str]) -> Result<RoomMessageEventContent> { if body.len() < 2 || !body[0].trim().starts_with("```") || body.last().unwrap_or(&"").trim() != "```" { return Ok(RoomMessageEventContent::text_plain( "Expected code block in command body. Add --help for details.", @@ -403,7 +404,7 @@ pub(super) async fn sign_json(body: Vec<&str>) -> Result<RoomMessageEventContent } } -pub(super) async fn verify_json(body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn verify_json(body: &[&str]) -> Result<RoomMessageEventContent> { if body.len() < 2 || !body[0].trim().starts_with("```") || body.last().unwrap_or(&"").trim() != "```" { return Ok(RoomMessageEventContent::text_plain( "Expected code block in command body. Add --help for details.", @@ -434,7 +435,7 @@ pub(super) async fn verify_json(body: Vec<&str>) -> Result<RoomMessageEventConte } #[tracing::instrument(skip(_body))] -pub(super) async fn first_pdu_in_room(_body: Vec<&str>, room_id: Box<RoomId>) -> Result<RoomMessageEventContent> { +pub(super) async fn first_pdu_in_room(_body: &[&str], room_id: Box<RoomId>) -> Result<RoomMessageEventContent> { if !services() .rooms .state_cache @@ -455,7 +456,7 @@ pub(super) async fn first_pdu_in_room(_body: Vec<&str>, room_id: Box<RoomId>) -> } #[tracing::instrument(skip(_body))] -pub(super) async fn latest_pdu_in_room(_body: Vec<&str>, room_id: Box<RoomId>) -> Result<RoomMessageEventContent> { +pub(super) async fn latest_pdu_in_room(_body: &[&str], room_id: Box<RoomId>) -> Result<RoomMessageEventContent> { if !services() .rooms .state_cache @@ -477,7 +478,7 @@ pub(super) async fn latest_pdu_in_room(_body: Vec<&str>, room_id: Box<RoomId>) - #[tracing::instrument(skip(_body))] pub(super) async fn force_set_room_state_from_server( - _body: Vec<&str>, room_id: Box<RoomId>, server_name: Box<ServerName>, + _body: &[&str], room_id: Box<RoomId>, server_name: Box<ServerName>, ) -> Result<RoomMessageEventContent> { if !services() .rooms @@ -607,7 +608,7 @@ pub(super) async fn force_set_room_state_from_server( } pub(super) async fn get_signing_keys( - _body: Vec<&str>, server_name: Option<Box<ServerName>>, _cached: bool, + _body: &[&str], server_name: Option<Box<ServerName>>, _cached: bool, ) -> Result<RoomMessageEventContent> { let server_name = server_name.unwrap_or_else(|| services().server.config.server_name.clone().into()); let signing_keys = services().globals.signing_keys_for(&server_name)?; @@ -619,7 +620,7 @@ pub(super) async fn get_signing_keys( #[allow(dead_code)] pub(super) async fn get_verify_keys( - _body: Vec<&str>, server_name: Option<Box<ServerName>>, cached: bool, + _body: &[&str], server_name: Option<Box<ServerName>>, cached: bool, ) -> Result<RoomMessageEventContent> { let server_name = server_name.unwrap_or_else(|| services().server.config.server_name.clone().into()); let mut out = String::new(); @@ -651,7 +652,7 @@ pub(super) async fn get_verify_keys( } pub(super) async fn resolve_true_destination( - _body: Vec<&str>, server_name: Box<ServerName>, no_cache: bool, + _body: &[&str], server_name: Box<ServerName>, no_cache: bool, ) -> Result<RoomMessageEventContent> { if !services().globals.config.allow_federation { return Ok(RoomMessageEventContent::text_plain( @@ -691,7 +692,7 @@ pub(super) async fn resolve_true_destination( Ok(RoomMessageEventContent::text_markdown(msg)) } -pub(super) async fn memory_stats(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn memory_stats(_body: &[&str]) -> Result<RoomMessageEventContent> { let html_body = conduit::alloc::memory_stats(); if html_body.is_none() { @@ -707,7 +708,7 @@ pub(super) async fn memory_stats(_body: Vec<&str>) -> Result<RoomMessageEventCon } #[cfg(tokio_unstable)] -pub(super) async fn runtime_metrics(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn runtime_metrics(_body: &[&str]) -> Result<RoomMessageEventContent> { let out = services().server.metrics.runtime_metrics().map_or_else( || "Runtime metrics are not available.".to_owned(), |metrics| format!("```rs\n{metrics:#?}\n```"), @@ -717,14 +718,14 @@ pub(super) async fn runtime_metrics(_body: Vec<&str>) -> Result<RoomMessageEvent } #[cfg(not(tokio_unstable))] -pub(super) async fn runtime_metrics(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn runtime_metrics(_body: &[&str]) -> Result<RoomMessageEventContent> { Ok(RoomMessageEventContent::text_markdown( "Runtime metrics require building with `tokio_unstable`.", )) } #[cfg(tokio_unstable)] -pub(super) async fn runtime_interval(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn runtime_interval(_body: &[&str]) -> Result<RoomMessageEventContent> { let out = services().server.metrics.runtime_interval().map_or_else( || "Runtime metrics are not available.".to_owned(), |metrics| format!("```rs\n{metrics:#?}\n```"), @@ -734,13 +735,13 @@ pub(super) async fn runtime_interval(_body: Vec<&str>) -> Result<RoomMessageEven } #[cfg(not(tokio_unstable))] -pub(super) async fn runtime_interval(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn runtime_interval(_body: &[&str]) -> Result<RoomMessageEventContent> { Ok(RoomMessageEventContent::text_markdown( "Runtime metrics require building with `tokio_unstable`.", )) } -pub(super) async fn time(_body: Vec<&str>) -> Result<RoomMessageEventContent> { +pub(super) async fn time(_body: &[&str]) -> Result<RoomMessageEventContent> { let now = SystemTime::now(); Ok(RoomMessageEventContent::text_markdown(utils::time::format(now, "%+"))) } diff --git a/src/macros/admin.rs b/src/macros/admin.rs index e95e402ae6ec442bbafb6b9420ed3b6a041812a9..a1a5b22ae4add8b675e19144795c99fe019cce1f 100644 --- a/src/macros/admin.rs +++ b/src/macros/admin.rs @@ -32,7 +32,7 @@ fn dispatch_arm(v: &Variant) -> TokenStream2 { let field = fields.named.iter().filter_map(|f| f.ident.as_ref()); let arg = field.clone(); quote! { - #name { #( #field ),* } => Box::pin(#handler(body, #( #arg ),*)).await?, + #name { #( #field ),* } => Box::pin(#handler(&body, #( #arg ),*)).await?, } }, Fields::Unnamed(fields) => { @@ -43,7 +43,7 @@ fn dispatch_arm(v: &Variant) -> TokenStream2 { }, Fields::Unit => { quote! { - #name => Box::pin(#handler(body)).await?, + #name => Box::pin(#handler(&body)).await?, } }, }