From 224ba65d067a0725dfa697e58b26b5e34a4a0740 Mon Sep 17 00:00:00 2001 From: Charles Hall Date: Tue, 14 May 2024 17:44:06 -0700 Subject: [PATCH] enable `map_unwrap_or` lint --- Cargo.toml | 1 + src/api/client_server/context.rs | 6 +-- src/api/client_server/tag.rs | 45 ++++++++++-------- src/database/key_value/globals.rs | 2 +- src/database/key_value/rooms/user.rs | 6 +-- src/database/key_value/users.rs | 3 +- src/service/rooms/state_accessor.rs | 71 +++++++++++++++------------- src/service/rooms/timeline.rs | 6 ++- src/service/sending.rs | 6 ++- src/service/uiaa.rs | 8 ++-- 10 files changed, 81 insertions(+), 73 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f55a82e5..965f66cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ let_underscore_must_use = "warn" lossy_float_literal = "warn" manual_let_else = "warn" manual_string_new = "warn" +map_unwrap_or = "warn" mem_forget = "warn" missing_assert_message = "warn" mod_module_files = "warn" diff --git a/src/api/client_server/context.rs b/src/api/client_server/context.rs index 3957e83a..44c6bd40 100644 --- a/src/api/client_server/context.rs +++ b/src/api/client_server/context.rs @@ -105,8 +105,7 @@ pub(crate) async fn get_context_route( let start_token = events_before .last() - .map(|(count, _)| count.stringify()) - .unwrap_or_else(|| base_token.stringify()); + .map_or_else(|| base_token.stringify(), |(count, _)| count.stringify()); let events_before: Vec<_> = events_before .into_iter() @@ -161,8 +160,7 @@ pub(crate) async fn get_context_route( let end_token = events_after .last() - .map(|(count, _)| count.stringify()) - .unwrap_or_else(|| base_token.stringify()); + .map_or_else(|| base_token.stringify(), |(count, _)| count.stringify()); let events_after: Vec<_> = events_after .into_iter() diff --git a/src/api/client_server/tag.rs b/src/api/client_server/tag.rs index 4c333821..616fc618 100644 --- a/src/api/client_server/tag.rs +++ b/src/api/client_server/tag.rs @@ -24,18 +24,19 @@ pub(crate) async fn update_tag_route( RoomAccountDataEventType::Tag, )?; - let mut tags_event = event - .map(|e| { - serde_json::from_str(e.get()) - .map_err(|_| Error::bad_database("Invalid account data event in db.")) - }) - .unwrap_or_else(|| { + let mut tags_event = event.map_or_else( + || { Ok(TagEvent { content: TagEventContent { tags: BTreeMap::new(), }, }) - })?; + }, + |e| { + serde_json::from_str(e.get()) + .map_err(|_| Error::bad_database("Invalid account data event in db.")) + }, + )?; tags_event .content @@ -68,18 +69,19 @@ pub(crate) async fn delete_tag_route( RoomAccountDataEventType::Tag, )?; - let mut tags_event = event - .map(|e| { - serde_json::from_str(e.get()) - .map_err(|_| Error::bad_database("Invalid account data event in db.")) - }) - .unwrap_or_else(|| { + let mut tags_event = event.map_or_else( + || { Ok(TagEvent { content: TagEventContent { tags: BTreeMap::new(), }, }) - })?; + }, + |e| { + serde_json::from_str(e.get()) + .map_err(|_| Error::bad_database("Invalid account data event in db.")) + }, + )?; tags_event.content.tags.remove(&body.tag.clone().into()); @@ -109,18 +111,19 @@ pub(crate) async fn get_tags_route( RoomAccountDataEventType::Tag, )?; - let tags_event = event - .map(|e| { - serde_json::from_str(e.get()) - .map_err(|_| Error::bad_database("Invalid account data event in db.")) - }) - .unwrap_or_else(|| { + let tags_event = event.map_or_else( + || { Ok(TagEvent { content: TagEventContent { tags: BTreeMap::new(), }, }) - })?; + }, + |e| { + serde_json::from_str(e.get()) + .map_err(|_| Error::bad_database("Invalid account data event in db.")) + }, + )?; Ok(get_tags::v3::Response { tags: tags_event.content.tags, diff --git a/src/database/key_value/globals.rs b/src/database/key_value/globals.rs index 10748ccd..1d899301 100644 --- a/src/database/key_value/globals.rs +++ b/src/database/key_value/globals.rs @@ -276,7 +276,7 @@ lasttimelinecount_cache: {lasttimelinecount_cache}\n" ); tree }) - .unwrap_or_else(BTreeMap::new); + .unwrap_or_default(); Ok(signingkeys) } diff --git a/src/database/key_value/rooms/user.rs b/src/database/key_value/rooms/user.rs index 4c435720..58b07eee 100644 --- a/src/database/key_value/rooms/user.rs +++ b/src/database/key_value/rooms/user.rs @@ -31,11 +31,10 @@ impl service::rooms::user::Data for KeyValueDatabase { self.userroomid_notificationcount .get(&userroom_id)? - .map(|bytes| { + .map_or(Ok(0), |bytes| { utils::u64_from_bytes(&bytes) .map_err(|_| Error::bad_database("Invalid notification count in db.")) }) - .unwrap_or(Ok(0)) } fn highlight_count(&self, user_id: &UserId, room_id: &RoomId) -> Result { @@ -45,11 +44,10 @@ impl service::rooms::user::Data for KeyValueDatabase { self.userroomid_highlightcount .get(&userroom_id)? - .map(|bytes| { + .map_or(Ok(0), |bytes| { utils::u64_from_bytes(&bytes) .map_err(|_| Error::bad_database("Invalid highlight count in db.")) }) - .unwrap_or(Ok(0)) } fn last_notification_read(&self, user_id: &UserId, room_id: &RoomId) -> Result { diff --git a/src/database/key_value/users.rs b/src/database/key_value/users.rs index d2e1ef14..6e12d284 100644 --- a/src/database/key_value/users.rs +++ b/src/database/key_value/users.rs @@ -348,12 +348,11 @@ impl service::users::Data for KeyValueDatabase { fn last_one_time_keys_update(&self, user_id: &UserId) -> Result { self.userid_lastonetimekeyupdate .get(user_id.as_bytes())? - .map(|bytes| { + .map_or(Ok(0), |bytes| { utils::u64_from_bytes(&bytes).map_err(|_| { Error::bad_database("Count in roomid_lastroomactiveupdate is invalid.") }) }) - .unwrap_or(Ok(0)) } fn take_one_time_key( diff --git a/src/service/rooms/state_accessor.rs b/src/service/rooms/state_accessor.rs index d6b9213a..ca2d8fb3 100644 --- a/src/service/rooms/state_accessor.rs +++ b/src/service/rooms/state_accessor.rs @@ -363,41 +363,46 @@ impl Service { federation: bool, ) -> Result { self.room_state_get(room_id, &StateEventType::RoomPowerLevels, "")? - .map(|e| { - serde_json::from_str(e.content.get()) - .map(|c: RoomPowerLevelsEventContent| c.into()) - .map(|e: RoomPowerLevels| { - e.user_can_redact_event_of_other(sender) - || e.user_can_redact_own_event(sender) - && if let Ok(Some(pdu)) = services().rooms.timeline.get_pdu(redacts) - { - if federation { - pdu.sender().server_name() == sender.server_name() + .map_or_else( + // Falling back on m.room.create to judge power levels + || { + if let Some(pdu) = + self.room_state_get(room_id, &StateEventType::RoomCreate, "")? + { + Ok(pdu.sender == sender + || if let Ok(Some(pdu)) = services().rooms.timeline.get_pdu(redacts) { + pdu.sender == sender + } else { + false + }) + } else { + Err(Error::bad_database( + "No m.room.power_levels or m.room.create events in database for room", + )) + } + }, + |e| { + serde_json::from_str(e.content.get()) + .map(|c: RoomPowerLevelsEventContent| c.into()) + .map(|e: RoomPowerLevels| { + e.user_can_redact_event_of_other(sender) + || e.user_can_redact_own_event(sender) + && if let Ok(Some(pdu)) = + services().rooms.timeline.get_pdu(redacts) + { + if federation { + pdu.sender().server_name() == sender.server_name() + } else { + pdu.sender == sender + } } else { - pdu.sender == sender + false } - } else { - false - } - }) - .map_err(|_| { - Error::bad_database("Invalid m.room.power_levels event in database") - }) - }) - // Falling back on m.room.create to judge power levels - .unwrap_or_else(|| { - if let Some(pdu) = self.room_state_get(room_id, &StateEventType::RoomCreate, "")? { - Ok(pdu.sender == sender - || if let Ok(Some(pdu)) = services().rooms.timeline.get_pdu(redacts) { - pdu.sender == sender - } else { - false }) - } else { - Err(Error::bad_database( - "No m.room.power_levels or m.room.create events in database for room", - )) - } - }) + .map_err(|_| { + Error::bad_database("Invalid m.room.power_levels event in database") + }) + }, + ) } } diff --git a/src/service/rooms/timeline.rs b/src/service/rooms/timeline.rs index e03dec8e..132b079d 100644 --- a/src/service/rooms/timeline.rs +++ b/src/service/rooms/timeline.rs @@ -338,8 +338,10 @@ impl Service { .map_err(|_| Error::bad_database("Invalid push rules event in db.")) }) .transpose()? - .map(|ev: PushRulesEvent| ev.content.global) - .unwrap_or_else(|| Ruleset::server_default(user)); + .map_or_else( + || Ruleset::server_default(user), + |ev: PushRulesEvent| ev.content.global, + ); let mut highlight = false; let mut notify = false; diff --git a/src/service/sending.rs b/src/service/sending.rs index 6ca6e462..02324e7e 100644 --- a/src/service/sending.rs +++ b/src/service/sending.rs @@ -581,8 +581,10 @@ impl Service { ) .unwrap_or_default() .and_then(|event| serde_json::from_str::(event.get()).ok()) - .map(|ev: PushRulesEvent| ev.content.global) - .unwrap_or_else(|| push::Ruleset::server_default(userid)); + .map_or_else( + || push::Ruleset::server_default(userid), + |ev: PushRulesEvent| ev.content.global, + ); let unread: UInt = services() .rooms diff --git a/src/service/uiaa.rs b/src/service/uiaa.rs index 8d812e41..1efd1d85 100644 --- a/src/service/uiaa.rs +++ b/src/service/uiaa.rs @@ -47,10 +47,10 @@ impl Service { auth: &AuthData, uiaainfo: &UiaaInfo, ) -> Result<(bool, UiaaInfo)> { - let mut uiaainfo = auth - .session() - .map(|session| self.db.get_uiaa_session(user_id, device_id, session)) - .unwrap_or_else(|| Ok(uiaainfo.clone()))?; + let mut uiaainfo = auth.session().map_or_else( + || Ok(uiaainfo.clone()), + |session| self.db.get_uiaa_session(user_id, device_id, session), + )?; if uiaainfo.session.is_none() { uiaainfo.session = Some(utils::random_string(SESSION_ID_LENGTH));