diff --git a/Cargo.toml b/Cargo.toml index d206ef29..9a60da04 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ inconsistent_struct_constructor = "warn" items_after_statements = "warn" let_underscore_must_use = "warn" lossy_float_literal = "warn" +manual_let_else = "warn" mem_forget = "warn" missing_assert_message = "warn" mod_module_files = "warn" diff --git a/src/api/appservice_server.rs b/src/api/appservice_server.rs index 0c29472d..8591abb3 100644 --- a/src/api/appservice_server.rs +++ b/src/api/appservice_server.rs @@ -17,11 +17,8 @@ pub(crate) async fn send_request( where T: Debug, { - let destination = match registration.url { - Some(url) => url, - None => { - return Ok(None); - } + let Some(destination) = registration.url else { + return Ok(None); }; let hs_token = registration.hs_token.as_str(); diff --git a/src/api/client_server/alias.rs b/src/api/client_server/alias.rs index 6bba5f6b..38bbe85b 100644 --- a/src/api/client_server/alias.rs +++ b/src/api/client_server/alias.rs @@ -166,14 +166,11 @@ pub(crate) async fn get_alias_helper( } }; - let room_id = match room_id { - Some(room_id) => room_id, - None => { - return Err(Error::BadRequest( - ErrorKind::NotFound, - "Room with alias not found.", - )) - } + let Some(room_id) = room_id else { + return Err(Error::BadRequest( + ErrorKind::NotFound, + "Room with alias not found.", + )); }; Ok(get_alias::v3::Response::new( diff --git a/src/api/client_server/context.rs b/src/api/client_server/context.rs index a91f536a..3957e83a 100644 --- a/src/api/client_server/context.rs +++ b/src/api/client_server/context.rs @@ -178,21 +178,15 @@ pub(crate) async fn get_context_route( .get_statekey_from_short(shortstatekey)?; if event_type != StateEventType::RoomMember { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; state.push(pdu.to_state_event()); } else if !lazy_load_enabled || lazy_loaded.contains(&state_key) { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; state.push(pdu.to_state_event()); } diff --git a/src/api/client_server/filter.rs b/src/api/client_server/filter.rs index 5293a95e..0ceefe40 100644 --- a/src/api/client_server/filter.rs +++ b/src/api/client_server/filter.rs @@ -13,9 +13,8 @@ pub(crate) async fn get_filter_route( body: Ruma, ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - let filter = match services().users.get_filter(sender_user, &body.filter_id)? { - Some(filter) => filter, - None => return Err(Error::BadRequest(ErrorKind::NotFound, "Filter not found.")), + let Some(filter) = services().users.get_filter(sender_user, &body.filter_id)? else { + return Err(Error::BadRequest(ErrorKind::NotFound, "Filter not found.")); }; Ok(get_filter::v3::Response::new(filter)) diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs index 44aa25c3..632b9ff2 100644 --- a/src/api/client_server/membership.rs +++ b/src/api/client_server/membership.rs @@ -762,17 +762,15 @@ async fn join_room_by_id_helper( return Err(error); }; - let (signed_event_id, signed_value) = - match gen_event_id_canonical_json(&signed_raw, &room_version_id) { - Ok(t) => t, - Err(_) => { - // Event could not be converted to canonical json - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Could not convert event to canonical json.", - )); - } - }; + let Ok((signed_event_id, signed_value)) = + gen_event_id_canonical_json(&signed_raw, &room_version_id) + else { + // Event could not be converted to canonical json + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Could not convert event to canonical json.", + )); + }; if signed_event_id != event_id { return Err(Error::BadRequest( @@ -905,17 +903,15 @@ async fn join_room_by_id_helper( if let Some(signed_raw) = &send_join_response.room_state.event { info!("There is a signed event. This room is probably using restricted joins. Adding signature to our event"); - let (signed_event_id, signed_value) = - match gen_event_id_canonical_json(signed_raw, &room_version_id) { - Ok(t) => t, - Err(_) => { - // Event could not be converted to canonical json - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Could not convert event to canonical json.", - )); - } - }; + let Ok((signed_event_id, signed_value)) = + gen_event_id_canonical_json(signed_raw, &room_version_id) + else { + // Event could not be converted to canonical json + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Could not convert event to canonical json.", + )); + }; if signed_event_id != event_id { return Err(Error::BadRequest( @@ -975,9 +971,8 @@ async fn join_room_by_id_helper( .iter() .map(|pdu| validate_and_add_event_id(pdu, &room_version_id, &pub_key_map)) { - let (event_id, value) = match result.await { - Ok(t) => t, - Err(_) => continue, + let Ok((event_id, value)) = result.await else { + continue; }; let pdu = PduEvent::from_id_val(&event_id, value.clone()).map_err(|e| { @@ -1005,9 +1000,8 @@ async fn join_room_by_id_helper( .iter() .map(|pdu| validate_and_add_event_id(pdu, &room_version_id, &pub_key_map)) { - let (event_id, value) = match result.await { - Ok(t) => t, - Err(_) => continue, + let Ok((event_id, value)) = result.await else { + continue; }; services() @@ -1277,16 +1271,13 @@ pub(crate) async fn invite_helper( let pub_key_map = RwLock::new(BTreeMap::new()); // We do not add the event_id field to the pdu here because of signature and hashes checks - let (event_id, value) = match gen_event_id_canonical_json(&response.event, &room_version_id) - { - Ok(t) => t, - Err(_) => { - // Event could not be converted to canonical json - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Could not convert event to canonical json.", - )); - } + let Ok((event_id, value)) = gen_event_id_canonical_json(&response.event, &room_version_id) + else { + // Event could not be converted to canonical json + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Could not convert event to canonical json.", + )); }; if *pdu.event_id != *event_id { @@ -1395,10 +1386,7 @@ pub(crate) async fn leave_all_rooms(user_id: &UserId) -> Result<()> { .collect::>(); for room_id in all_rooms { - let room_id = match room_id { - Ok(room_id) => room_id, - Err(_) => continue, - }; + let Ok(room_id) = room_id else { continue }; if let Err(error) = leave_room(user_id, &room_id, None).await { warn!(%user_id, %room_id, %error, "failed to leave room"); diff --git a/src/api/client_server/report.rs b/src/api/client_server/report.rs index af07760d..1f118622 100644 --- a/src/api/client_server/report.rs +++ b/src/api/client_server/report.rs @@ -14,14 +14,11 @@ pub(crate) async fn report_event_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - let pdu = match services().rooms.timeline.get_pdu(&body.event_id)? { - Some(pdu) => pdu, - _ => { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Invalid Event ID", - )) - } + let Some(pdu) = services().rooms.timeline.get_pdu(&body.event_id)? else { + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Invalid Event ID", + )); }; if let Some(true) = body.score.map(|s| s > int!(0) || s < int!(-100)) { diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs index 4d11f272..9a7e5440 100644 --- a/src/api/client_server/sync.rs +++ b/src/api/client_server/sync.rs @@ -337,28 +337,23 @@ async fn sync_helper( None => HashMap::new(), }; - let left_event_id = match services().rooms.state_accessor.room_state_get_id( + let Some(left_event_id) = services().rooms.state_accessor.room_state_get_id( &room_id, &StateEventType::RoomMember, sender_user.as_str(), - )? { - Some(e) => e, - None => { - error!("Left room but no left state event"); - continue; - } + )? + else { + error!("Left room but no left state event"); + continue; }; - let left_shortstatehash = match services() + let Some(left_shortstatehash) = services() .rooms .state_accessor .pdu_shortstatehash(&left_event_id)? - { - Some(s) => s, - None => { - error!("Leave event has no state"); - continue; - } + else { + error!("Leave event has no state"); + continue; }; let mut left_state_ids = services() @@ -386,12 +381,9 @@ async fn sync_helper( // TODO: Delete the following line when this is resolved: https://github.com/vector-im/element-web/issues/22565 || *sender_user == state_key { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; left_state_events.push(pdu.to_sync_state_event()); @@ -607,13 +599,11 @@ async fn load_joined_room( // Database queries: - let current_shortstatehash = - if let Some(s) = services().rooms.state.get_room_shortstatehash(room_id)? { - s - } else { - error!("Room {} has no state", room_id); - return Err(Error::BadDatabase("Room has no state")); - }; + let Some(current_shortstatehash) = services().rooms.state.get_room_shortstatehash(room_id)? + else { + error!("Room {} has no state", room_id); + return Err(Error::BadDatabase("Room has no state")); + }; let since_shortstatehash = services() .rooms @@ -747,12 +737,9 @@ async fn load_joined_room( .get_statekey_from_short(shortstatekey)?; if event_type != StateEventType::RoomMember { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; state_events.push(pdu); @@ -766,12 +753,9 @@ async fn load_joined_room( // TODO: Delete the following line when this is resolved: https://github.com/vector-im/element-web/issues/22565 || *sender_user == state_key { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; // This check is in case a bad user ID made it into the database @@ -836,12 +820,9 @@ async fn load_joined_room( for (key, id) in current_state_ids { if full_state || since_state_ids.get(&key) != Some(&id) { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; if pdu.kind == TimelineEventType::RoomMember { @@ -1234,13 +1215,12 @@ pub(crate) async fn sync_events_v4_route( ); for room_id in &all_joined_rooms { - let current_shortstatehash = - if let Some(s) = services().rooms.state.get_room_shortstatehash(room_id)? { - s - } else { - error!("Room {} has no state", room_id); - continue; - }; + let Some(current_shortstatehash) = + services().rooms.state.get_room_shortstatehash(room_id)? + else { + error!("Room {} has no state", room_id); + continue; + }; let since_shortstatehash = services() .rooms @@ -1302,12 +1282,9 @@ pub(crate) async fn sync_events_v4_route( for (key, id) in current_state_ids { if since_state_ids.get(&key) != Some(&id) { - let pdu = match services().rooms.timeline.get_pdu(&id)? { - Some(pdu) => pdu, - None => { - error!("Pdu in state not found: {}", id); - continue; - } + let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { + error!("Pdu in state not found: {}", id); + continue; }; if pdu.kind == TimelineEventType::RoomMember { if let Some(state_key) = &pdu.state_key { diff --git a/src/api/server_server.rs b/src/api/server_server.rs index c28e8bea..92bd028d 100644 --- a/src/api/server_server.rs +++ b/src/api/server_server.rs @@ -656,15 +656,12 @@ pub(crate) fn parse_incoming_pdu( let room_version_id = services().rooms.state.get_room_version(&room_id)?; - let (event_id, value) = match gen_event_id_canonical_json(pdu, &room_version_id) { - Ok(t) => t, - Err(_) => { - // Event could not be converted to canonical json - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Could not convert event to canonical json.", - )); - } + let Ok((event_id, value)) = gen_event_id_canonical_json(pdu, &room_version_id) else { + // Event could not be converted to canonical json + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Could not convert event to canonical json.", + )); }; Ok((event_id, value, room_id)) } @@ -1514,15 +1511,12 @@ async fn create_join_event( // We do not add the event_id field to the pdu here because of signature and hashes checks let room_version_id = services().rooms.state.get_room_version(room_id)?; - let (event_id, value) = match gen_event_id_canonical_json(pdu, &room_version_id) { - Ok(t) => t, - Err(_) => { - // Event could not be converted to canonical json - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Could not convert event to canonical json.", - )); - } + let Ok((event_id, value)) = gen_event_id_canonical_json(pdu, &room_version_id) else { + // Event could not be converted to canonical json + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Could not convert event to canonical json.", + )); }; let origin: OwnedServerName = serde_json::from_value( diff --git a/src/database.rs b/src/database.rs index 94509c79..ff8f47ad 100644 --- a/src/database.rs +++ b/src/database.rs @@ -424,12 +424,9 @@ impl KeyValueDatabase { for (roomserverid, _) in db.roomserverids.iter() { let mut parts = roomserverid.split(|&b| b == 0xff); let room_id = parts.next().expect("split always returns one element"); - let servername = match parts.next() { - Some(s) => s, - None => { - error!("Migration: Invalid roomserverid in db."); - continue; - } + let Some(servername) = parts.next() else { + error!("Migration: Invalid roomserverid in db."); + continue; }; let mut serverroomid = servername.to_vec(); serverroomid.push(0xff); diff --git a/src/database/key_value/rooms/search.rs b/src/database/key_value/rooms/search.rs index 652c508c..6a52b348 100644 --- a/src/database/key_value/rooms/search.rs +++ b/src/database/key_value/rooms/search.rs @@ -54,12 +54,9 @@ impl service::rooms::search::Data for KeyValueDatabase { .map(move |(key, _)| key[prefix3.len()..].to_vec()) }); - let common_elements = match utils::common_elements(iterators, |a, b| { - // We compare b with a because we reversed the iterator earlier - b.cmp(a) - }) { - Some(it) => it, - None => return Ok(None), + // We compare b with a because we reversed the iterator earlier + let Some(common_elements) = utils::common_elements(iterators, |a, b| b.cmp(a)) else { + return Ok(None); }; Ok(Some((Box::new(common_elements), words))) diff --git a/src/database/key_value/rooms/state_accessor.rs b/src/database/key_value/rooms/state_accessor.rs index fe40b937..dc5a112d 100644 --- a/src/database/key_value/rooms/state_accessor.rs +++ b/src/database/key_value/rooms/state_accessor.rs @@ -79,13 +79,12 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { event_type: &StateEventType, state_key: &str, ) -> Result>> { - let shortstatekey = match services() + let Some(shortstatekey) = services() .rooms .short .get_shortstatekey(event_type, state_key)? - { - Some(s) => s, - None => return Ok(None), + else { + return Ok(None); }; let full_state = services() .rooms diff --git a/src/service/rooms/event_handler.rs b/src/service/rooms/event_handler.rs index 92538227..5587a303 100644 --- a/src/service/rooms/event_handler.rs +++ b/src/service/rooms/event_handler.rs @@ -342,14 +342,11 @@ impl Service { Ok(ruma::signatures::Verified::Signatures) => { // Redact warn!("Calculated hash does not match: {}", event_id); - let obj = match ruma::canonical_json::redact(value, room_version_id, None) { - Ok(obj) => obj, - Err(_) => { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Redaction failed", - )) - } + let Ok(obj) = ruma::canonical_json::redact(value, room_version_id, None) else { + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "Redaction failed", + )); }; // Skip the PDU if it is redacted and we already have it as an outlier event @@ -409,12 +406,9 @@ impl Service { // Build map of auth events let mut auth_events = HashMap::new(); for id in &incoming_pdu.auth_events { - let auth_event = match services().rooms.timeline.get_pdu(id)? { - Some(e) => e, - None => { - warn!("Could not find auth event {}", id); - continue; - } + let Some(auth_event) = services().rooms.timeline.get_pdu(id)? else { + warn!("Could not find auth event {}", id); + continue; }; self.check_room_id(room_id, &auth_event)?; @@ -574,21 +568,16 @@ impl Service { let mut okay = true; for prev_eventid in &incoming_pdu.prev_events { - let prev_event = - if let Ok(Some(pdu)) = services().rooms.timeline.get_pdu(prev_eventid) { - pdu - } else { - okay = false; - break; - }; + let Ok(Some(prev_event)) = services().rooms.timeline.get_pdu(prev_eventid) else { + okay = false; + break; + }; - let sstatehash = if let Ok(Some(s)) = services() + let Ok(Some(sstatehash)) = services() .rooms .state_accessor .pdu_shortstatehash(prev_eventid) - { - s - } else { + else { okay = false; break; }; @@ -1046,16 +1035,12 @@ impl Service { }; let lock = services().globals.stateres_mutex.lock(); - let state = match state_res::resolve( - room_version_id, - &fork_states, - auth_chain_sets, - fetch_event, - ) { - Ok(new_state) => new_state, - Err(_) => { - return Err(Error::bad_database("State resolution failed, either an event could not be found or deserialization")); - } + let Ok(state) = + state_res::resolve(room_version_id, &fork_states, auth_chain_sets, fetch_event) + else { + return Err(Error::bad_database( + "State resolution failed, either an event could not be found or deserialization", + )); }; drop(lock); @@ -1184,14 +1169,12 @@ impl Service { { Ok(res) => { info!("Got {} over federation", next_id); - let (calculated_event_id, value) = - match pdu::gen_event_id_canonical_json(&res.pdu, room_version_id) { - Ok(t) => t, - Err(_) => { - back_off((*next_id).to_owned()).await; - continue; - } - }; + let Ok((calculated_event_id, value)) = + pdu::gen_event_id_canonical_json(&res.pdu, room_version_id) + else { + back_off((*next_id).to_owned()).await; + continue; + }; if calculated_event_id != *next_id { warn!("Server didn't return event id we requested: requested: {}, we got {}. Event: {:?}", @@ -1410,12 +1393,9 @@ impl Service { ) .await; - let keys = match fetch_res { - Ok(keys) => keys, - Err(_) => { - warn!("Signature verification failed: Could not fetch signing key.",); - continue; - } + let Ok(keys) = fetch_res else { + warn!("Signature verification failed: Could not fetch signing key.",); + continue; }; pub_key_map @@ -1640,23 +1620,21 @@ impl Service { /// Returns Ok if the acl allows the server pub(crate) fn acl_check(&self, server_name: &ServerName, room_id: &RoomId) -> Result<()> { - let acl_event = match services().rooms.state_accessor.room_state_get( + let Some(acl_event) = services().rooms.state_accessor.room_state_get( room_id, &StateEventType::RoomServerAcl, "", - )? { - Some(acl) => acl, - None => return Ok(()), + )? + else { + return Ok(()); }; - let acl_event_content: RoomServerAclEventContent = - match serde_json::from_str(acl_event.content.get()) { - Ok(content) => content, - Err(_) => { - warn!("Invalid ACL event"); - return Ok(()); - } - }; + let Ok(acl_event_content) = + serde_json::from_str::(acl_event.content.get()) + else { + warn!("Invalid ACL event"); + return Ok(()); + }; if acl_event_content.allow.is_empty() { // Ignore broken acl events diff --git a/src/service/rooms/state.rs b/src/service/rooms/state.rs index 2b3da501..daa17a58 100644 --- a/src/service/rooms/state.rs +++ b/src/service/rooms/state.rs @@ -45,9 +45,8 @@ impl Service { .ok() .map(|(_, id)| id) }) { - let pdu = match services().rooms.timeline.get_pdu_json(&event_id)? { - Some(pdu) => pdu, - None => continue, + let Some(pdu) = services().rooms.timeline.get_pdu_json(&event_id)? else { + continue; }; let pdu: PduEvent = match serde_json::from_str( @@ -70,14 +69,12 @@ impl Service { Err(_) => continue, }; - let state_key = match pdu.state_key { - Some(k) => k, - None => continue, + let Some(state_key) = pdu.state_key else { + continue; }; - let user_id = match UserId::parse(state_key) { - Ok(id) => id, - Err(_) => continue, + let Ok(user_id) = UserId::parse(state_key) else { + continue; }; services().rooms.state_cache.update_membership( @@ -377,11 +374,7 @@ impl Service { state_key: Option<&str>, content: &serde_json::value::RawValue, ) -> Result>> { - let shortstatehash = if let Some(current_shortstatehash) = - services().rooms.state.get_room_shortstatehash(room_id)? - { - current_shortstatehash - } else { + let Some(shortstatehash) = services().rooms.state.get_room_shortstatehash(room_id)? else { return Ok(HashMap::new()); }; diff --git a/src/service/rooms/state_accessor.rs b/src/service/rooms/state_accessor.rs index 6026677e..d6b9213a 100644 --- a/src/service/rooms/state_accessor.rs +++ b/src/service/rooms/state_accessor.rs @@ -109,9 +109,8 @@ impl Service { room_id: &RoomId, event_id: &EventId, ) -> Result { - let shortstatehash = match self.pdu_shortstatehash(event_id)? { - Some(shortstatehash) => shortstatehash, - None => return Ok(true), + let Some(shortstatehash) = self.pdu_shortstatehash(event_id)? else { + return Ok(true); }; if let Some(visibility) = self @@ -173,9 +172,8 @@ impl Service { room_id: &RoomId, event_id: &EventId, ) -> Result { - let shortstatehash = match self.pdu_shortstatehash(event_id)? { - Some(shortstatehash) => shortstatehash, - None => return Ok(true), + let Some(shortstatehash) = self.pdu_shortstatehash(event_id)? else { + return Ok(true); }; if let Some(visibility) = self diff --git a/src/service/sending.rs b/src/service/sending.rs index 9f82a716..6ca6e462 100644 --- a/src/service/sending.rs +++ b/src/service/sending.rs @@ -564,13 +564,12 @@ impl Service { } } - let pusher = match services() + let Some(pusher) = services() .pusher .get_pusher(userid, pushkey) .map_err(|e| (OutgoingKind::Push(userid.clone(), pushkey.clone()), e))? - { - Some(pusher) => pusher, - None => continue, + else { + continue; }; let rules_for_user = services() diff --git a/src/service/uiaa.rs b/src/service/uiaa.rs index 190fb195..8d812e41 100644 --- a/src/service/uiaa.rs +++ b/src/service/uiaa.rs @@ -63,14 +63,11 @@ impl Service { password, .. }) => { - let username = match identifier { - UserIdentifier::UserIdOrLocalpart(username) => username, - _ => { - return Err(Error::BadRequest( - ErrorKind::Unrecognized, - "Identifier type not recognized.", - )) - } + let UserIdentifier::UserIdOrLocalpart(username) = identifier else { + return Err(Error::BadRequest( + ErrorKind::Unrecognized, + "Identifier type not recognized.", + )); }; let user_id = UserId::parse_with_server_name(