[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1109537: ITP: stalwart, All-in-one Mail & Collaboration server.



Package: wnpp
Followup-For: Bug #1109537

Hi,

I tried to "cargo deb" it, here are a few notes:

- cargo-deb isn't in Debian (?), so `cargo install cargo-deb` was needed
- the sources target rust 1.88 (2024). However Debian has rust 1.86 (and 1.87 in experimental).
  See attached trivial patch - which is done *after* dependencies are downloaded, so one has
  to run `cargo deb` once before applying it.

Jérémy
Description: Chained if not supported in rust 1.86
Forwarded: https://github.com/rust-lang/rust/issues/53667
Author: Jérémy Lal <kapouer@melix.org>
Last-Update: 2025-09-13
--- a/crates/utils/src/json/pointer.rs
+++ b/crates/utils/src/json/pointer.rs
@@ -71,10 +71,10 @@
     ) {
         match pointer.next() {
             Some(JsonPointerItem::String(n)) => {
-                if let serde_json::Value::Object(map) = self
-                    && let Some(v) = map.get(n)
-                {
-                    v.eval_pointer(pointer, results);
+                if let serde_json::Value::Object(map) = self {
+                    if let Some(v) = map.get(n) {
+                        v.eval_pointer(pointer, results);
+                    }
                 }
             }
             Some(JsonPointerItem::Number(n)) => match self {
--- a/crates/nlp/src/tokenizers/types.rs
+++ b/crates/nlp/src/tokenizers/types.rs
@@ -88,14 +88,14 @@
         }
 
         // Try parsing currencies and floating point numbers
-        if self.tokenize_numbers
-            && !last_is_dot
-            && let Some(num) = self.try_parse_number()
-        {
-            self.peek_advance();
-            return Some(num);
+        if self.tokenize_numbers && !last_is_dot {
+            if let Some(num) = self.try_parse_number() {
+                self.peek_advance();
+                return Some(num);
+            }
         }
 
+
         self.peek_rewind();
         self.next_()
     }
--- a/crates/store/src/config.rs
+++ b/crates/store/src/config.rs
@@ -431,11 +431,12 @@
             "tracing.history.store",
             "metrics.history.store",
         ] {
-            if let Some(store_id) = self.value(key)
-                && store_id == id
-            {
-                return true;
+            if let Some(store_id) = self.value(key) {
+                if store_id == id {
+                    return true;
+                }
             }
+
         }
 
         false
--- a/crates/jmap-proto/src/response/references.rs
+++ b/crates/jmap-proto/src/response/references.rs
@@ -144,8 +144,8 @@
                 let mut graph = HashMap::with_capacity(request.create.len());
                 for (create_id, object) in request.create.iter_mut() {
                     for data in &mut object.data {
-                        if let DataSourceObject::Id { id, .. } = data
-                            && let MaybeReference::Reference(parent_id) = id
+                        if let DataSourceObject::Id { id, .. } = data {
+                            if let MaybeReference::Reference(parent_id) = id
                         {
                             match self.created_ids.get(parent_id) {
                                 Some(AnyId::Blob(blob_id)) => {
@@ -166,6 +166,7 @@
                                 }
                             }
                         }
+                        }
                     }
                 }
 
--- a/crates/jmap-proto/src/types/value.rs
+++ b/crates/jmap-proto/src/types/value.rs
@@ -580,21 +580,21 @@
     ) {
         match pointer.next() {
             Some(JsonPointerItem::String(n)) => {
-                if let Value::Object(map) = self
-                    && let Some(v) = map
+                if let Value::Object(map) = self {
+                    if let Some(v) = map
                         .0
                         .iter()
                         .find_map(|(k, v)| if k.as_str() == n { Some(v) } else { None })
                 {
                     v.eval_pointer(pointer, results);
-                }
+                }}
             }
             Some(JsonPointerItem::Number(n)) => {
-                if let Value::List(values) = self
-                    && let Some(v) = values.get(*n as usize)
+                if let Value::List(values) = self {
+                    if let Some(v) = values.get(*n as usize)
                 {
                     v.eval_pointer(pointer, results);
-                }
+                }}
             }
             Some(JsonPointerItem::Wildcard) => match self {
                 Value::List(values) => {
--- a/crates/directory/src/backend/internal/lookup.rs
+++ b/crates/directory/src/backend/internal/lookup.rs
@@ -45,14 +45,14 @@
             },
         };
 
-        if let Some(account_id) = account_id
-            && let Some(mut principal) = self.get_principal(account_id).await?
+        if let Some(account_id) = account_id {
+            if let Some(mut principal) = self.get_principal(account_id).await?
         {
-            if let Some(secret) = secret
-                && !principal.verify_secret(secret, by.only_app_pass).await?
+            if let Some(secret) = secret {
+                if !principal.verify_secret(secret, by.only_app_pass).await?
             {
                 return Ok(None);
-            }
+            }}
 
             if by.return_member_of {
                 let mut roles = vec![];
@@ -78,7 +78,7 @@
                 }
             }
             return Ok(Some(principal));
-        }
+        }}
         Ok(None)
     }
 
--- a/crates/directory/src/backend/internal/manage.rs
+++ b/crates/directory/src/backend/internal/manage.rs
@@ -354,8 +354,8 @@
             principal_create.tenant = tenant_id.into();
 
             if !matches!(principal_create.typ, Type::Tenant | Type::Domain) {
-                if let Some(domain) = name.split('@').nth(1)
-                    && self
+                if let Some(domain) = name.split('@').nth(1) {
+                    if self
                         .get_principal_info(domain)
                         .await
                         .caused_by(trc::location!())?
@@ -363,7 +363,7 @@
                         .is_some()
                 {
                     valid_domains.insert(domain.into());
-                }
+                }}
 
                 if valid_domains.is_empty() {
                     return Err(error(
@@ -523,15 +523,15 @@
                 if self.rcpt(&email).await.caused_by(trc::location!())? != RcptType::Invalid {
                     return Err(err_exists(PrincipalField::Emails, email.to_string()));
                 }
-                if let Some(domain) = email.split('@').nth(1)
-                    && valid_domains.insert(domain.into())
+                if let Some(domain) = email.split('@').nth(1) {
+                    if valid_domains.insert(domain.into())
                 {
                     self.get_principal_info(domain)
                         .await
                         .caused_by(trc::location!())?
                         .filter(|v| v.typ == Type::Domain && v.has_tenant_access(tenant_id))
                         .ok_or_else(|| not_found(domain.to_string()))?;
-                }
+                }}
                 principal_create.emails.push(email);
             }
         }
@@ -1003,8 +1003,8 @@
                         if tenant_id.is_some()
                             && !matches!(principal_type, Type::Tenant | Type::Domain)
                         {
-                            if let Some(domain) = new_name.split('@').nth(1)
-                                && self
+                            if let Some(domain) = new_name.split('@').nth(1) {
+                                if self
                                     .get_principal_info(domain)
                                     .await
                                     .caused_by(trc::location!())?
@@ -1014,7 +1014,7 @@
                                     .is_some()
                             {
                                 valid_domains.insert(domain.to_string());
-                            }
+                            }}
 
                             if valid_domains.is_empty() {
                                 return Err(error(
@@ -1572,8 +1572,8 @@
                     for member_id in &members {
                         if !new_members.contains(member_id) {
                             // Update changed principal ids
-                            if principal_type != Type::List
-                                && let Some(member_info) = self
+                            if principal_type != Type::List {
+                                if let Some(member_info) = self
                                     .get_principal(*member_id)
                                     .await
                                     .caused_by(trc::location!())?
@@ -1584,7 +1584,7 @@
                                     principal_id,
                                     principal_type,
                                 );
-                            }
+                            }}
 
                             batch.clear(ValueClass::Directory(DirectoryClass::MemberOf {
                                 principal_id: *member_id,
@@ -2328,15 +2328,15 @@
 
         // Map tenant name
         #[cfg(feature = "enterprise")]
-        if let Some(tenant_id) = principal.tenant
-            && (fields.is_empty() || fields.contains(&PrincipalField::Tenant))
-            && let Some(name) = self
+        if let Some(tenant_id) = principal.tenant {
+            if (fields.is_empty() || fields.contains(&PrincipalField::Tenant)) {
+            if let Some(name) = self
                 .get_principal_name(tenant_id)
                 .await
                 .caused_by(trc::location!())?
         {
             result.set(PrincipalField::Tenant, name);
-        }
+        }}}
 
         // SPDX-SnippetEnd
 
@@ -2345,11 +2345,11 @@
             (PrincipalField::Name, Some(principal.name)),
             (PrincipalField::Description, principal.description),
         ] {
-            if let Some(value) = value
-                && (fields.is_empty() || fields.contains(&name))
+            if let Some(value) = value {
+                if (fields.is_empty() || fields.contains(&name))
             {
                 result.set(name, value);
-            }
+            }}
         }
         for (name, value) in [
             (PrincipalField::Secrets, principal.secrets),
--- a/crates/directory/src/backend/ldap/lookup.rs
+++ b/crates/directory/src/backend/ldap/lookup.rs
@@ -230,13 +230,13 @@
                         .map_err(|err| err.into_error().caused_by(trc::location!()))?;
                     for entry in rs {
                         'outer: for (attr, value) in SearchEntry::construct(entry).attrs {
-                            if self.mappings.attr_name.contains(&attr)
-                                && let Some(group) = value.into_iter().next()
-                                && !group.is_empty()
+                            if self.mappings.attr_name.contains(&attr) {
+                                if let Some(group) = value.into_iter().next() {
+                                if !group.is_empty()
                             {
                                 name = group;
                                 break 'outer;
-                            }
+                            }}}
                         }
                     }
                 }
@@ -313,15 +313,15 @@
         for entry in rs {
             let entry = SearchEntry::construct(entry);
             for attr in &self.mappings.attr_name {
-                if let Some(name) = entry.attrs.get(attr).and_then(|v| v.first())
-                    && !name.is_empty()
+                if let Some(name) = entry.attrs.get(attr).and_then(|v| v.first()) {
+                    if !name.is_empty()
                 {
                     return self
                         .data_store
                         .get_or_create_principal_id(name, Type::Individual)
                         .await
                         .map(Some);
-                }
+                }}
             }
         }
 
--- a/crates/directory/src/backend/sql/lookup.rs
+++ b/crates/directory/src/backend/sql/lookup.rs
@@ -293,11 +293,11 @@
                     if let Value::Text(text) = value {
                         principal.emails.push(text.to_lowercase());
                     }
-                } else if name.eq_ignore_ascii_case(&self.column_quota)
-                    && let Value::Integer(quota) = value
+                } else if name.eq_ignore_ascii_case(&self.column_quota) {
+                    if let Value::Integer(quota) = value
                 {
                     principal.quota = (quota as u64).into();
-                }
+                }}
             }
         }
 
--- a/crates/directory/src/core/dispatch.rs
+++ b/crates/directory/src/core/dispatch.rs
@@ -40,11 +40,11 @@
 
     pub async fn is_local_domain(&self, domain: &str) -> trc::Result<bool> {
         // Check cache
-        if let Some(cache) = &self.cache
-            && let Some(result) = cache.get_domain(domain)
+        if let Some(cache) = &self.cache {
+            if let Some(result) = cache.get_domain(domain)
         {
             return Ok(result);
-        }
+        }}
 
         let result = match &self.store {
             DirectoryInner::Internal(store) => store.is_local_domain(domain).await,
@@ -67,11 +67,11 @@
 
     pub async fn rcpt(&self, email: &str) -> trc::Result<RcptType> {
         // Check cache
-        if let Some(cache) = &self.cache
-            && let Some(result) = cache.get_rcpt(email)
+        if let Some(cache) = &self.cache {
+            if let Some(result) = cache.get_rcpt(email)
         {
             return Ok(result);
-        }
+        }}
 
         let result = match &self.store {
             DirectoryInner::Internal(store) => store.rcpt(email).await,
--- a/crates/directory/src/core/principal.rs
+++ b/crates/directory/src/core/principal.rs
@@ -238,12 +238,12 @@
             } else {
                 None
             }
-        }) && let Some(idx) = permissions
+        }) { if let Some(idx) = permissions
             .iter_mut()
             .position(|p| p.permission == permission && p.grant == grant)
         {
             permissions.swap_remove(idx);
-        }
+        }}
     }
 
     pub fn remove_permissions(&mut self, grant: bool) {
@@ -272,11 +272,11 @@
         }
 
         // If the principal has no roles, take the ones from the external principal
-        if let Some(roles) = external.roles_mut().filter(|s| !s.is_empty())
-            && self.roles().is_empty()
+        if let Some(roles) = external.roles_mut().filter(|s| !s.is_empty()) {
+            if self.roles().is_empty()
         {
             self.data.push(PrincipalData::Roles(std::mem::take(roles)));
-        }
+        }}
 
         if external.description.as_ref().is_some_and(|v| !v.is_empty())
             && self.description != external.description
--- a/crates/common/src/addresses.rs
+++ b/crates/common/src/addresses.rs
@@ -186,11 +186,11 @@
     ) -> Cow<'x, str> {
         match self {
             AddressMapping::Enable => {
-                if let Some((local_part, domain_part)) = address.rsplit_once('@')
-                    && let Some((local_part, _)) = local_part.split_once('+')
+                if let Some((local_part, domain_part)) = address.rsplit_once('@') {
+                    if let Some((local_part, _)) = local_part.split_once('+')
                 {
                     return format!("{}@{}", local_part, domain_part).into();
-                }
+                }}
             }
             AddressMapping::Custom(if_block) => {
                 if let Some(result) = core
--- a/crates/common/src/auth/access_token.rs
+++ b/crates/common/src/auth/access_token.rs
@@ -69,8 +69,8 @@
         // SPDX-License-Identifier: LicenseRef-SEL
 
         #[cfg(feature = "enterprise")]
-        if self.is_enterprise_edition()
-            && let Some(tenant_id) = principal.tenant
+        if self.is_enterprise_edition() {
+            if let Some(tenant_id) = principal.tenant
         {
             // Limit tenant permissions
 
@@ -95,7 +95,7 @@
                     .quota
                     .unwrap_or_default(),
             });
-        }
+        }}
 
         // SPDX-SnippetEnd
 
@@ -111,11 +111,11 @@
                 .store()
                 .query(QueryParams::id(group_id).with_return_member_of(false))
                 .await
-                .caused_by(trc::location!())?
-                && group.typ == Type::Group
+                .caused_by(trc::location!())? {
+                if group.typ == Type::Group
             {
                 emails.extend(group.emails);
-            }
+            }}
         }
 
         // Build access token
--- a/crates/common/src/auth/mod.rs
+++ b/crates/common/src/auth/mod.rs
@@ -167,15 +167,15 @@
                     }
                     _ => {
                         // Validate API credentials
-                        if req.allow_api_access
-                            && let Ok(Some(principal)) = self
+                        if req.allow_api_access {
+                            if let Ok(Some(principal)) = self
                                 .store()
                                 .query(
                                     QueryParams::credentials(&req.credentials)
                                         .with_return_member_of(req.return_member_of),
                                 )
-                                .await
-                            && principal.typ == Type::ApiKey
+                                .await {
+                            if principal.typ == Type::ApiKey
                         {
                             trc::event!(
                                 Auth(trc::AuthEvent::Success),
@@ -185,7 +185,7 @@
                             );
 
                             return Ok(principal);
-                        }
+                        }}}
                     }
                 }
             }
--- a/crates/common/src/auth/rate_limit.rs
+++ b/crates/common/src/auth/rate_limit.rs
@@ -57,9 +57,9 @@
     }
 
     pub async fn is_http_anonymous_request_allowed(&self, addr: &IpAddr) -> trc::Result<()> {
-        if let Some(rate) = &self.core.jmap.rate_anonymous
-            && !self.is_ip_allowed(addr)
-            && self
+        if let Some(rate) = &self.core.jmap.rate_anonymous {
+            if !self.is_ip_allowed(addr) {
+            if self
                 .core
                 .storage
                 .lookup
@@ -74,7 +74,7 @@
                 .is_some()
         {
             return Err(trc::LimitEvent::TooManyRequests.into_err());
-        }
+        }}}
         Ok(())
     }
 
--- a/crates/common/src/config/spamfilter.rs
+++ b/crates/common/src/config/spamfilter.rs
@@ -330,14 +330,14 @@
         ] {
             if config
                 .property_or_default(("spam-filter.header", typ, "enable"), "true")
-                .unwrap_or(true)
-                && let Some(value) = config.value(("spam-filter.header", typ, "name"))
+                .unwrap_or(true) {
+                if let Some(value) = config.value(("spam-filter.header", typ, "name"))
             {
                 let value = value.trim();
                 if !value.is_empty() {
                     *var = value.to_string().into();
                 }
-            }
+            }}
         }
 
         header
--- a/crates/common/src/config/telemetry.rs
+++ b/crates/common/src/config/telemetry.rs
@@ -170,12 +170,12 @@
             .collect::<Vec<_>>()
         {
             if let Some(event_type) =
-                config.try_parse_value::<EventType>(("tracing.level", &event_name), &event_name)
-                && let Some(level) =
+                config.try_parse_value::<EventType>(("tracing.level", &event_name), &event_name) {
+                if let Some(level) =
                     config.property_require::<Level>(("tracing.level", &event_name))
             {
                 custom_levels.insert(event_type, level);
-            }
+            }}
         }
 
         // Parse tracers
@@ -528,8 +528,8 @@
         {
             if config
                 .property_or_default("tracing.history.enable", "false")
-                .unwrap_or(false)
-                && let Some(store_id) = config.value_require("tracing.history.store")
+                .unwrap_or(false) {
+                if let Some(store_id) = config.value_require("tracing.history.store")
             {
                 if let Some(store) = stores.stores.get(store_id) {
                     let mut tracer = TelemetrySubscriber {
@@ -551,7 +551,7 @@
                     let err = format!("Store {store_id} not found");
                     config.new_build_error("tracing.history.store", err);
                 }
-            }
+            }}
         }
         // SPDX-SnippetEnd
 
@@ -609,18 +609,18 @@
             if config
                 .value(("tracer", tracer_id, "enable"))
                 .unwrap_or("true")
-                == "true"
-                && config
+                == "true" {
+                if config
                     .value(("tracer", tracer_id, "type"))
                     .unwrap_or_default()
-                    == "log"
-                && let Some(path) = config
+                    == "log" {
+                if let Some(path) = config
                     .value(("tracer", tracer_id, "path"))
                     .map(|s| s.to_string())
             {
                 metrics.log_path = Some(path);
                 break;
-            }
+            }}}
         }
 
         if config
--- a/crates/common/src/core.rs
+++ b/crates/common/src/core.rs
@@ -412,8 +412,8 @@
         // SPDX-License-Identifier: LicenseRef-SEL
 
         #[cfg(feature = "enterprise")]
-        if self.core.is_enterprise_edition()
-            && let Some(tenant) = quotas.tenant.filter(|tenant| tenant.quota != 0)
+        if self.core.is_enterprise_edition() {
+            if let Some(tenant) = quotas.tenant.filter(|tenant| tenant.quota != 0)
         {
             let used_quota = self.get_used_quota(tenant.id).await? as u64;
 
@@ -423,7 +423,7 @@
                     .ctx(trc::Key::Limit, tenant.quota)
                     .ctx(trc::Key::Size, used_quota));
             }
-        }
+        }}
 
         // SPDX-SnippetEnd
 
@@ -462,8 +462,8 @@
                 // SPDX-License-Identifier: LicenseRef-SEL
 
                 #[cfg(feature = "enterprise")]
-                if self.core.is_enterprise_edition()
-                    && let Some(tenant_id) = principal.tenant()
+                if self.core.is_enterprise_edition() {
+                    if let Some(tenant_id) = principal.tenant()
                 {
                     quotas.tenant = TenantInfo {
                         id: tenant_id,
@@ -480,7 +480,7 @@
                             .unwrap_or_default(),
                     }
                     .into();
-                }
+                }}
 
                 // SPDX-SnippetEnd
             }
@@ -804,15 +804,15 @@
     }
 
     pub async fn cluster_broadcast(&self, event: BroadcastEvent) {
-        if let Some(broadcast_tx) = &self.inner.ipc.broadcast_tx.clone()
-            && broadcast_tx.send(event).await.is_err()
+        if let Some(broadcast_tx) = &self.inner.ipc.broadcast_tx.clone() {
+            if broadcast_tx.send(event).await.is_err()
         {
             trc::event!(
                 Server(trc::ServerEvent::ThreadError),
                 Details = "Error sending broadcast event.",
                 CausedBy = trc::location!()
             );
-        }
+        }}
     }
 
     #[allow(clippy::blocks_in_conditions)]
--- a/crates/common/src/listener/listen.rs
+++ b/crates/common/src/listener/listen.rs
@@ -279,24 +279,24 @@
                 Details = "Failed to set TCP_NODELAY",
             );
         }
-        if let Some(ttl) = self.ttl
-            && let Err(err) = stream.set_ttl(ttl)
+        if let Some(ttl) = self.ttl {
+            if let Err(err) = stream.set_ttl(ttl)
         {
             trc::event!(
                 Network(trc::NetworkEvent::SetOptError),
                 Reason = err.to_string(),
                 Details = "Failed to set TTL",
             );
-        }
-        if self.linger.is_some()
-            && let Err(err) = stream.set_linger(self.linger)
+        }}
+        if self.linger.is_some() {
+            if let Err(err) = stream.set_linger(self.linger)
         {
             trc::event!(
                 Network(trc::NetworkEvent::SetOptError),
                 Reason = err.to_string(),
                 Details = "Failed to set LINGER",
             );
-        }
+        }}
     }
 }
 
--- a/crates/common/src/manager/boot.rs
+++ b/crates/common/src/manager/boot.rs
@@ -461,15 +461,15 @@
                 // Spam filter auto-update
                 if config
                     .property_or_default::<bool>("spam-filter.auto-update", "false")
-                    .unwrap_or_default()
-                    && let Err(err) = core.storage.config.update_spam_rules(false, false).await
+                    .unwrap_or_default() {
+                    if let Err(err) = core.storage.config.update_spam_rules(false, false).await
                 {
                     trc::event!(
                         Resource(trc::ResourceEvent::Error),
                         Details = "Failed to update spam-filter",
                         CausedBy = err
                     );
-                }
+                }}
 
                 // Build shared inner
                 let has_remote_asn = matches!(
--- a/crates/common/src/sharing/resources.rs
+++ b/crates/common/src/sharing/resources.rs
@@ -45,8 +45,8 @@
         let check_acls = check_acls.into();
 
         for resource in &self.resources {
-            if resource.document_id == document_id
-                && let Some(acls) = resource.acls()
+            if resource.document_id == document_id {
+                if let Some(acls) = resource.acls()
             {
                 for acl in acls {
                     if access_token.is_member(acl.account_id) {
@@ -56,7 +56,7 @@
                     }
                 }
                 break;
-            }
+            }}
         }
 
         false
@@ -66,8 +66,8 @@
         let mut account_acls = Bitmap::<Acl>::new();
 
         for resource in &self.resources {
-            if resource.document_id == document_id
-                && let Some(acls) = resource.acls()
+            if resource.document_id == document_id {
+                if let Some(acls) = resource.acls()
             {
                 for acl in acls {
                     if access_token.is_member(acl.account_id) {
@@ -75,7 +75,7 @@
                     }
                 }
                 break;
-            }
+            }}
         }
 
         account_acls
--- a/crates/common/src/telemetry/tracers/otel.rs
+++ b/crates/common/src/telemetry/tracers/otel.rs
@@ -57,8 +57,8 @@
                             pending_logs.push(otel.build_log_record(&event));
                         }
 
-                        if otel.span_exporter_enable
-                            && let Some(span) = event.inner.span.as_ref()
+                        if otel.span_exporter_enable {
+                            if let Some(span) = event.inner.span.as_ref()
                         {
                             let span_id = span.span_id().unwrap();
                             if !event.inner.typ.is_span_end() {
@@ -74,7 +74,7 @@
                                     &instrumentation,
                                 ));
                             }
-                        }
+                        }}
                     }
                 }
                 Ok(None) => {
@@ -90,8 +90,8 @@
                 if !pending_spans.is_empty() || !pending_logs.is_empty() {
                     next_delivery = now + otel.throttle;
 
-                    if !pending_spans.is_empty()
-                        && let Err(err) = otel
+                    if !pending_spans.is_empty() {
+                        if let Err(err) = otel
                             .span_exporter
                             .export(std::mem::take(&mut pending_spans))
                             .await
@@ -101,7 +101,7 @@
                             Details = "Failed to export spans",
                             Reason = err.to_string()
                         );
-                    }
+                    }}
 
                     if !pending_logs.is_empty() {
                         let logs = pending_logs
--- a/crates/groupware/src/calendar/alarm.rs
+++ b/crates/groupware/src/calendar/alarm.rs
@@ -80,8 +80,8 @@
                         .single()?
                         .timestamp();
 
-                    if let Some(alarm_time) = alarm.delta.to_timestamp(start, end, default_tz)
-                        && alarm_time > start_time
+                    if let Some(alarm_time) = alarm.delta.to_timestamp(start, end, default_tz) {
+                        if alarm_time > start_time
                     {
                         if let Some(next) = next_alarm {
                             if alarm_time < next.alarm_time {
@@ -107,7 +107,7 @@
                             });
                         }
                         continue 'outer;
-                    }
+                    }}
                 }
             } else {
                 // Single event
@@ -126,8 +126,8 @@
                     .single()?
                     .timestamp();
 
-                if let Some(alarm_time) = alarm.delta.to_timestamp(start, end, default_tz)
-                    && alarm_time > start_time
+                if let Some(alarm_time) = alarm.delta.to_timestamp(start, end, default_tz) {
+                    if alarm_time > start_time
                 {
                     if let Some(next) = next_alarm {
                         if alarm_time < next.alarm_time {
@@ -152,7 +152,7 @@
                             event_end_tz: end_tz.as_id(),
                         });
                     }
-                }
+                }}
             }
         }
 
--- a/crates/spam-filter/src/analysis/bayes.rs
+++ b/crates/spam-filter/src/analysis/bayes.rs
@@ -24,9 +24,9 @@
 
 impl SpamFilterAnalyzeBayes for Server {
     async fn spam_filter_analyze_bayes_classify(&self, ctx: &mut SpamFilterContext<'_>) {
-        if let Some(config) = &self.core.spam.bayes
-            && !ctx.result.has_tag("SPAM_TRAP")
-            && !ctx.result.has_tag("TRUSTED_REPLY")
+        if let Some(config) = &self.core.spam.bayes {
+            if !ctx.result.has_tag("SPAM_TRAP") {
+            if !ctx.result.has_tag("TRUSTED_REPLY")
         {
             match self.bayes_classify(ctx).await {
                 Ok(Some(score)) => {
@@ -41,7 +41,7 @@
                     trc::error!(err.span_id(ctx.input.span_id).caused_by(trc::location!()));
                 }
             }
-        }
+        }}}
     }
 
     async fn spam_filter_analyze_spam_trap(&self, ctx: &mut SpamFilterContext<'_>) -> bool {
--- a/crates/spam-filter/src/analysis/domain.rs
+++ b/crates/spam-filter/src/analysis/domain.rs
@@ -41,14 +41,14 @@
 
         // Add DKIM domains
         for dkim in ctx.input.dkim_result {
-            if dkim.result() == &DkimResult::Pass
-                && let Some(domain) = dkim.signature().map(|s| &s.d)
+            if dkim.result() == &DkimResult::Pass {
+                if let Some(domain) = dkim.signature().map(|s| &s.d)
             {
                 domains.insert(ElementLocation::new(
                     CompactString::from_str_to_lowercase(domain),
                     Location::HeaderDkimPass,
                 ));
-            }
+            }}
         }
 
         // Add Received headers
@@ -59,11 +59,11 @@
                         .into_iter()
                         .flatten()
                     {
-                        if let Host::Name(name) = host
-                            && let Some(name) = Hostname::new(name.as_ref()).sld
+                        if let Host::Name(name) = host {
+                            if let Some(name) = Hostname::new(name.as_ref()).sld
                         {
                             domains.insert(ElementLocation::new(name, Location::HeaderReceived));
-                        }
+                        }}
                     }
                 }
                 (HeaderName::MessageId, value) => {
--- a/crates/spam-filter/src/analysis/from.rs
+++ b/crates/spam-filter/src/analysis/from.rs
@@ -86,8 +86,8 @@
                     ctx.result.add_tag("FROM_HAS_DN");
                 }
 
-                if from_name_trimmed.contains('@')
-                    && let Some(from_name_addr) = TypesTokenizer::new(from_name_trimmed)
+                if from_name_trimmed.contains('@') {
+                    if let Some(from_name_addr) = TypesTokenizer::new(from_name_trimmed)
                         .tokenize_numbers(false)
                         .tokenize_urls(false)
                         .tokenize_urls_without_scheme(false)
@@ -113,7 +113,7 @@
                     } else {
                         ctx.result.add_tag("FROM_NEQ_DISPLAY_NAME");
                     }
-                }
+                }}
             }
 
             // Check sender
@@ -187,11 +187,11 @@
             }
 
             // Check whether read confirmation address is different to from address
-            if let Some(crt) = crt
-                && crt != from_addr.address
+            if let Some(crt) = crt {
+                if crt != from_addr.address
             {
                 ctx.result.add_tag("HEADER_RCONFIRM_MISMATCH");
-            }
+            }}
         }
 
         if !env_from_empty {
@@ -215,11 +215,11 @@
             }
 
             // Check whether disposition notification address is different to return path
-            if let Some(dnt) = dnt
-                && dnt != ctx.output.env_from_addr.address
+            if let Some(dnt) = dnt {
+                if dnt != ctx.output.env_from_addr.address
             {
                 ctx.result.add_tag("HEADER_FORGED_MDN");
-            }
+            }}
         }
     }
 }
--- a/crates/spam-filter/src/analysis/ip.rs
+++ b/crates/spam-filter/src/analysis/ip.rs
@@ -38,22 +38,22 @@
             if let (HeaderName::Received, HeaderValue::Received(received)) =
                 (&header.name, &header.value)
             {
-                if let Some(ip) = received.from_ip()
-                    && !ip.is_loopback()
-                    && !self.is_ip_allowed(&ip)
+                if let Some(ip) = received.from_ip() {
+                    if !ip.is_loopback() {
+                    if !self.is_ip_allowed(&ip)
                 {
                     ips.insert(ElementLocation::new(ip, Location::HeaderReceived));
-                }
+                }}}
                 for host in [&received.from, &received.helo, &received.by]
                     .into_iter()
                     .flatten()
                 {
-                    if let Host::IpAddr(ip) = host
-                        && !ip.is_loopback()
-                        && !self.is_ip_allowed(ip)
+                    if let Host::IpAddr(ip) = host {
+                        if !ip.is_loopback() {
+                        if !self.is_ip_allowed(ip)
                     {
                         ips.insert(ElementLocation::new(*ip, Location::HeaderReceived));
-                    }
+                    }}}
                 }
             }
         }
--- a/crates/spam-filter/src/analysis/mime.rs
+++ b/crates/spam-filter/src/analysis/mime.rs
@@ -366,8 +366,8 @@
             if is_attachment {
                 // Has a MIME attachment
                 ctx.result.add_tag("HAS_ATTACHMENT");
-                if ct_full != "application/octet-stream"
-                    && let Some(t) = infer::get(part.contents())
+                if ct_full != "application/octet-stream" {
+                    if let Some(t) = infer::get(part.contents())
                 {
                     if t.mime_type() == ct_full {
                         // Known content-type
@@ -376,7 +376,7 @@
                         // Known bad content-type
                         ctx.result.add_tag("MIME_BAD");
                     }
-                }
+                }}
             }
 
             // Analyze attachment name
--- a/crates/spam-filter/src/analysis/received.rs
+++ b/crates/spam-filter/src/analysis/received.rs
@@ -47,22 +47,22 @@
                         // HELO domain is "user"
                         ctx.result.add_tag("RCVD_HELO_USER");
                     } else if let (Some(Host::Name(helo_domain)), Some(ip_rev)) =
-                        (helo_domain, ip_rev)
-                        && helo_domain.to_lowercase() != ip_rev.to_lowercase()
+                        (helo_domain, ip_rev) {
+                        if helo_domain.to_lowercase() != ip_rev.to_lowercase()
                     {
                         // HELO domain does not match PTR record
                         ctx.result.add_tag("FORGED_RCVD_TRAIL");
-                    }
+                    }}
 
-                    if let Some(delivered_for) = received.for_().map(|s| s.to_lowercase())
-                        && ctx
+                    if let Some(delivered_for) = received.for_().map(|s| s.to_lowercase()) {
+                        if ctx
                             .output
                             .all_recipients()
                             .any(|r| r.email.address == delivered_for)
                     {
                         // Recipient appears on Received trail
                         ctx.result.add_tag("PREVIOUSLY_DELIVERED");
-                    }
+                    }}
 
                     if matches!(received.from, Some(Host::IpAddr(_))) {
                         // Received from an IP address rather than a FQDN
--- a/crates/spam-filter/src/analysis/recipient.rs
+++ b/crates/spam-filter/src/analysis/recipient.rs
@@ -101,12 +101,12 @@
 
                 // Check for spaces in recipient addresses
                 for token in raw_utf8.split('<') {
-                    if let Some((addr, _)) = token.split_once('>')
-                        && (addr.starts_with(' ') || addr.ends_with(' '))
+                    if let Some((addr, _)) = token.split_once('>') {
+                        if (addr.starts_with(' ') || addr.ends_with(' '))
                     {
                         ctx.result.add_tag("TO_WRAPPED_IN_SPACES");
                         break;
-                    }
+                    }}
                 }
             }
         }
--- a/crates/spam-filter/src/analysis/trusted_reply.rs
+++ b/crates/spam-filter/src/analysis/trusted_reply.rs
@@ -64,7 +64,8 @@
         if let (Some(hold_time), Some(message_id)) = (
             self.core.spam.expiry.trusted_reply,
             ctx.input.message.message_id(),
-        ) && let Err(err) = self
+        ) {
+        if let Err(err) = self
             .in_memory_store()
             .key_set(
                 KeyValue::with_prefix(KV_TRUSTED_REPLY, message_id.as_bytes(), vec![])
@@ -73,7 +74,7 @@
             .await
         {
             trc::error!(err.span_id(ctx.input.span_id).caused_by(trc::location!()));
-        }
+        }}
 
         if self
             .core
--- a/crates/spam-filter/src/analysis/url.rs
+++ b/crates/spam-filter/src/analysis/url.rs
@@ -97,8 +97,8 @@
                 match token {
                     TokenType::Url(url) | TokenType::UrlNoScheme(url) => {
                         if is_body
-                            && !ctx.result.has_tag("RCPT_DOMAIN_IN_BODY")
-                            && let Some(url_parsed) = &url.url_parsed
+                            && !ctx.result.has_tag("RCPT_DOMAIN_IN_BODY") {
+                            if let Some(url_parsed) = &url.url_parsed
                         {
                             let host = url_parsed.host.sld_or_default();
                             for rcpt in ctx.output.all_recipients() {
@@ -107,7 +107,7 @@
                                     break;
                                 }
                             }
-                        }
+                        }}
 
                         urls.insert(ElementLocation::new(
                             url.to_owned(),
--- a/crates/spam-filter/src/modules/dnsbl.rs
+++ b/crates/spam-filter/src/modules/dnsbl.rs
@@ -52,8 +52,8 @@
 
     for dnsbl in &server.core.spam.dnsbl.servers {
         if dnsbl.scope == scope
-            && checks < max_checks
-            && let Some(tag) = is_dnsbl(
+            && checks < max_checks {
+            if let Some(tag) = is_dnsbl(
                 server,
                 dnsbl,
                 SpamFilterResolver::new(ctx, resolver, location),
@@ -63,7 +63,7 @@
             .await
         {
             ctx.result.add_tag(tag);
-        }
+        }}
     }
 
     match scope {
--- a/crates/spam-filter/src/modules/pyzor.rs
+++ b/crates/spam-filter/src/modules/pyzor.rs
@@ -320,15 +320,15 @@
                     continue;
                 }
                 b'>' if in_tag => {
-                    if tag_token_pos == 1
-                        && let Some(tag) = input.get(token_start..token_end + 1)
+                    if tag_token_pos == 1 {
+                        if let Some(tag) = input.get(token_start..token_end + 1)
                     {
                         if tag.eq_ignore_ascii_case(b"style") {
                             in_style = !is_tag_close;
                         } else if tag.eq_ignore_ascii_case(b"script") {
                             in_script = !is_tag_close;
                         }
-                    }
+                    }}
 
                     in_tag = false;
                     is_token_start = true;
--- a/crates/email/src/cache/email.rs
+++ b/crates/email/src/cache/email.rs
@@ -33,8 +33,8 @@
     };
 
     for (document_id, is_update) in changed_ids {
-        if *is_update
-            && let Some(archive) = server
+        if *is_update {
+            if let Some(archive) = server
                 .get_archive(account_id, Collection::Email, *document_id)
                 .await
                 .caused_by(trc::location!())?
@@ -44,7 +44,7 @@
                 *document_id,
                 archive.to_unarchived::<MessageData>()?,
             );
-        }
+        }}
     }
 
     for item in &store_cache.emails.items {
--- a/crates/email/src/cache/mailbox.rs
+++ b/crates/email/src/cache/mailbox.rs
@@ -28,8 +28,8 @@
     };
 
     for (document_id, is_update) in changed_ids {
-        if *is_update
-            && let Some(archive) = server
+        if *is_update {
+            if let Some(archive) = server
                 .get_archive(account_id, Collection::Mailbox, *document_id)
                 .await
                 .caused_by(trc::location!())?
@@ -39,7 +39,7 @@
                 *document_id,
                 archive.unarchive::<Mailbox>()?,
             );
-        }
+        }}
     }
 
     for item in store_cache.mailboxes.items.iter() {
--- a/crates/email/src/message/delete.rs
+++ b/crates/email/src/message/delete.rs
@@ -136,24 +136,24 @@
         }
 
         // Auto-expunge deleted and junk messages
-        if let Some(hold_period) = self.core.jmap.mail_autoexpunge_after
-            && let Err(err) = self.emails_auto_expunge(account_id, hold_period).await
+        if let Some(hold_period) = self.core.jmap.mail_autoexpunge_after {
+            if let Err(err) = self.emails_auto_expunge(account_id, hold_period).await
         {
             trc::error!(
                 err.details("Failed to auto-expunge e-mail messages.")
                     .account_id(account_id)
             );
-        }
+        }}
 
         // Auto-expunge iMIP messages
-        if let Some(hold_period) = self.core.groupware.itip_inbox_auto_expunge
-            && let Err(err) = self.itip_auto_expunge(account_id, hold_period).await
+        if let Some(hold_period) = self.core.groupware.itip_inbox_auto_expunge {
+            if let Err(err) = self.itip_auto_expunge(account_id, hold_period).await
         {
             trc::error!(
                 err.details("Failed to auto-expunge iTIP messages.")
                     .account_id(account_id)
             );
-        }
+        }}
 
         // Purge tombstoned messages
         if let Err(err) = self.emails_purge_tombstoned(account_id).await {
@@ -164,14 +164,14 @@
         }
 
         // Purge changelogs
-        if let Some(history) = self.core.jmap.changes_max_history
-            && let Err(err) = self.delete_changes(account_id, history).await
+        if let Some(history) = self.core.jmap.changes_max_history {
+            if let Err(err) = self.delete_changes(account_id, history).await
         {
             trc::error!(
                 err.details("Failed to purge changes.")
                     .account_id(account_id)
             );
-        }
+        }}
 
         // Delete lock
         if let Err(err) = self
--- a/crates/email/src/message/ingest.rs
+++ b/crates/email/src/message/ingest.rs
@@ -206,13 +206,13 @@
 
                     // If the message is classified as spam, check whether the sender address is present in the user's address book
                     if is_spam
-                        && self.core.spam.card_is_ham
-                        && let Some(sender) = message
+                        && self.core.spam.card_is_ham {
+                        if let Some(sender) = message
                             .from()
                             .and_then(|s| s.first())
                             .and_then(|s| s.address())
-                            .and_then(sanitize_email)
-                        && sender != deliver_to
+                            .and_then(sanitize_email) {
+                        if sender != deliver_to
                         && is_sender_authenticated
                         && !self
                             .store()
@@ -236,7 +236,7 @@
                         {
                             train_spam = Some(false);
                         }
-                    }
+                    }}}
 
                     // Classify the message with user's model
                     if let Some(bayes_config) = self.core.spam.bayes.as_ref().filter(|config| {
@@ -313,7 +313,8 @@
                                     .subtype()
                                     .is_some_and(|st| st.eq_ignore_ascii_case("calendar"))
                                 && ct.has_attribute("method")
-                        }) && let Some(itip_message) = part.text_contents()
+                        }) {
+                        if let Some(itip_message) = part.text_contents()
                         {
                             if itip_message.len() < self.core.groupware.itip_inbound_max_ical_size {
                                 if let Some(sender) = sender.get_or_insert_with(|| {
@@ -381,7 +382,7 @@
                                     Size = itip_message.len(),
                                 )
                             }
-                        }
+                        }}
                     }
                 }
             }
@@ -511,13 +512,13 @@
                     part.offset_end += offset_start as u32;
                     part.offset_header += offset_start as u32;
 
-                    if let PartType::Message(sub_message) = &mut part.body
-                        && sub_message.root_part().offset_header != 0
+                    if let PartType::Message(sub_message) = &mut part.body {
+                        if sub_message.root_part().offset_header != 0
                     {
                         sub_message.raw_message = raw_message.as_ref().into();
                         part_iter_stack.push(part_iter);
                         part_iter = sub_message.parts.iter_mut();
-                    }
+                    }}
                 } else if let Some(iter) = part_iter_stack.pop() {
                     part_iter = iter;
                 } else {
@@ -541,8 +542,8 @@
             IngestSource::Restore => false,
         };
         if do_encrypt
-            && !message.is_encrypted()
-            && let Some(encrypt_params_) = self
+            && !message.is_encrypted() {
+            if let Some(encrypt_params_) = self
                 .get_archive_by_property(account_id, Collection::Principal, 0, Property::Parameters)
                 .await
                 .caused_by(trc::location!())?
@@ -591,7 +592,7 @@
                 }
                 _ => unreachable!(),
             }
-        }
+        }}
 
         // Store blob
         let blob_id = self
--- a/crates/email/src/sieve/ingest.rs
+++ b/crates/email/src/sieve/ingest.rs
@@ -186,11 +186,11 @@
                                     TRASH_ID
                                 } else {
                                     let mut mailbox_id = u32::MAX;
-                                    if let Ok(role) = SpecialUse::parse_value(&role)
-                                        && let Some(m) = cache.mailbox_by_role(&role)
+                                    if let Ok(role) = SpecialUse::parse_value(&role) {
+                                        if let Some(m) = cache.mailbox_by_role(&role)
                                     {
                                         mailbox_id = m.document_id;
-                                    }
+                                    }}
 
                                     mailbox_id
                                 });
@@ -317,19 +317,19 @@
                         }
 
                         // Find mailbox by role
-                        if let Some(special_use) = special_use
-                            && target_id == u32::MAX
+                        if let Some(special_use) = special_use {
+                            if target_id == u32::MAX
                         {
                             if special_use.eq_ignore_ascii_case("inbox") {
                                 target_id = INBOX_ID;
                             } else if special_use.eq_ignore_ascii_case("trash") {
                                 target_id = TRASH_ID;
-                            } else if let Ok(role) = SpecialUse::parse_value(&special_use)
-                                && let Some(item) = cache.mailbox_by_role(&role)
+                            } else if let Ok(role) = SpecialUse::parse_value(&special_use) {
+                                if let Some(item) = cache.mailbox_by_role(&role)
                             {
                                 target_id = item.document_id;
-                            }
-                        }
+                            }}
+                        }}
 
                         // Find mailbox by name
                         if target_id == u32::MAX {
--- a/crates/dav/src/calendar/query.rs
+++ b/crates/dav/src/calendar/query.rs
@@ -275,12 +275,12 @@
                                     let mut matched_any = false;
 
                                     for value in entry.values.iter() {
-                                        if let Some(text) = value.as_text()
-                                            && text_match.matches(text)
+                                        if let Some(text) = value.as_text() {
+                                            if text_match.matches(text)
                                         {
                                             matched_any = true;
                                             break;
-                                        }
+                                        }}
                                     }
 
                                     matched_any
@@ -448,9 +448,9 @@
                     .unwrap();
 
                 // Limit recurrence override
-                if let Some(limit_recurrence) = &data.limit_recurrence
-                    && component.is_recurrence_override()
-                    && !self.expanded_times.iter().any(|event| {
+                if let Some(limit_recurrence) = &data.limit_recurrence {
+                    if component.is_recurrence_override() {
+                    if !self.expanded_times.iter().any(|event| {
                         event.comp_id == component_id
                             && limit_recurrence.is_in_range(
                                 component.component_type == ICalendarComponentType::VTodo,
@@ -460,18 +460,18 @@
                     })
                 {
                     continue;
-                }
+                }}}
 
                 // Limit freebusy
-                if let Some(limit_recurrence) = &data.limit_freebusy
-                    && component.component_type == ICalendarComponentType::VFreebusy
-                    && !self.expanded_times.iter().any(|event| {
+                if let Some(limit_recurrence) = &data.limit_freebusy {
+                    if component.component_type == ICalendarComponentType::VFreebusy {
+                    if !self.expanded_times.iter().any(|event| {
                         event.comp_id == component_id
                             && limit_recurrence.is_in_range(false, event.start, event.end)
                     })
                 {
                     continue;
-                }
+                }}}
 
                 // Filter entries
                 let mut entries = component
--- a/crates/dav/src/card/query.rs
+++ b/crates/dav/src/card/query.rs
@@ -124,12 +124,12 @@
                             let mut matched_any = false;
 
                             for value in entry.values.iter() {
-                                if let Some(text) = value.as_text()
-                                    && text_match.matches(text)
+                                if let Some(text) = value.as_text() {
+                                    if text_match.matches(text)
                                 {
                                     matched_any = true;
                                     break;
-                                }
+                                }}
                             }
 
                             matched_any
--- a/crates/dav/src/common/lock.rs
+++ b/crates/dav/src/common/lock.rs
@@ -525,8 +525,8 @@
                     }
 
                     if let Some(document_id) =
-                        resource_state.document_id.filter(|&id| id != u32::MAX)
-                        && let Some(archive) = self
+                        resource_state.document_id.filter(|&id| id != u32::MAX) {
+                        if let Some(archive) = self
                             .get_archive(
                                 resource_state.account_id,
                                 resource_state.collection,
@@ -536,13 +536,13 @@
                             .caused_by(trc::location!())?
                     {
                         resource_state.etag = archive.etag().into();
-                    }
+                    }}
                 }
 
                 // Fetch lock token
                 if needs_lock_token
-                    && resource_state.lock_tokens.is_empty()
-                    && let Some(idx) = locks.find_cache_pos(self, resource_state).await?
+                    && resource_state.lock_tokens.is_empty() {
+                    if let Some(idx) = locks.find_cache_pos(self, resource_state).await?
                 {
                     let found_locks = locks
                         .find_locks_by_pos(idx, resource_state, false)?
@@ -550,7 +550,7 @@
                         .map(|(_, lock)| lock.urn().to_string())
                         .collect::<Vec<_>>();
                     resource_state.lock_tokens = found_locks;
-                }
+                }}
 
                 // Fetch sync token
                 if needs_sync_token && resource_state.sync_token.is_none() {
--- a/crates/dav/src/common/propfind.rs
+++ b/crates/dav/src/common/propfind.rs
@@ -1037,12 +1037,12 @@
             }
 
             // Add dead properties
-            if skip_not_found
-                && let Some(dead_properties) =
+            if skip_not_found {
+                if let Some(dead_properties) =
                     dead_properties.filter(|dead_properties| !dead_properties.0.is_empty())
             {
                 dead_properties.to_dav_values(&mut fields);
-            }
+            }}
 
             // Add response
             let mut prop_stat = Vec::with_capacity(2);
@@ -1253,8 +1253,8 @@
                 }
             }
 
-            if maybe_has_vanished
-                && let Some(vanished_collection) = sync_collection.vanished_collection()
+            if maybe_has_vanished {
+                if let Some(vanished_collection) = sync_collection.vanished_collection()
             {
                 vanished = server
                     .store()
@@ -1262,7 +1262,7 @@
                     .await
                     .caused_by(trc::location!())?;
                 total_changes += vanished.len();
-            }
+            }}
 
             // Truncate changes
             if total_changes > limit {
--- a/crates/dav/src/file/copy_move.rs
+++ b/crates/dav/src/file/copy_move.rs
@@ -146,16 +146,16 @@
 
         // Validate destination ACLs
         if let Some(document_id) = destination.document_id {
-            if let Some(delete_destination) = &delete_destination
-                && !access_token.is_member(to_account_id)
-                && !from_resources.has_access_to_container(
+            if let Some(delete_destination) = &delete_destination {
+                if !access_token.is_member(to_account_id) {
+                if !from_resources.has_access_to_container(
                     access_token,
                     delete_destination.document_id.unwrap(),
                     Acl::Delete,
                 )
             {
                 return Err(DavError::Code(StatusCode::FORBIDDEN));
-            }
+            }}}
 
             if !access_token.is_member(to_account_id)
                 && !from_resources.has_access_to_container(access_token, document_id, Acl::Modify)
--- a/crates/email/src/sieve/activate.rs
+++ b/crates/email/src/sieve/activate.rs
@@ -78,8 +78,8 @@
         }
 
         // Activate script
-        if let Some(document_id) = activate_id
-            && let Some(sieve_) = self
+        if let Some(document_id) = activate_id {
+            if let Some(sieve_) = self
                 .get_archive(account_id, Collection::SieveScript, document_id)
                 .await?
         {
@@ -97,7 +97,7 @@
                 )
                 .caused_by(trc::location!())?;
             changed_ids.push((document_id, true));
-        }
+        }}
 
         // Write changes
         if !changed_ids.is_empty() {
--- a/crates/cli/src/modules/import.rs
+++ b/crates/cli/src/modules/import.rs
@@ -473,8 +473,8 @@
     for (path, mailbox) in build_mailbox_tree(&mailboxes) {
         let id = mailbox.id().unwrap_result("obtain mailbox id");
         // Find existing mailbox based on role
-        if !matches!(mailbox.role(), Role::None)
-            && let Some(existing_mailbox) = existing_mailboxes
+        if !matches!(mailbox.role(), Role::None) {
+            if let Some(existing_mailbox) = existing_mailboxes
                 .iter()
                 .find(|m| m.role() == mailbox.role())
         {
@@ -486,7 +486,7 @@
                     .to_string(),
             );
             continue;
-        }
+        }}
 
         // Find existing mailbox by name
         if let Some(mailbox) = nested_existing_mailboxes.get(&path) {
--- a/crates/imap/src/core/client.rs
+++ b/crates/imap/src/core/client.rs
@@ -260,14 +260,14 @@
             }
         }
 
-        if let Some(needs_literal) = needs_literal
-            && let Err(err) = self
+        if let Some(needs_literal) = needs_literal {
+            if let Err(err) = self
                 .write_bytes(format!("+ Ready for {} bytes.\r\n", needs_literal).into_bytes())
                 .await
         {
             self.write_error(err).await;
             return SessionResult::Close;
-        }
+        }}
 
         SessionResult::Continue
     }
@@ -293,9 +293,9 @@
     async fn is_allowed(&self, request: Request<Command>) -> trc::Result<Request<Command>> {
         let state = &self.state;
         // Rate limit request
-        if let State::Authenticated { data } | State::Selected { data, .. } = state
-            && let Some(rate) = &self.server.core.imap.rate_requests
-            && data
+        if let State::Authenticated { data } | State::Selected { data, .. } = state {
+            if let Some(rate) = &self.server.core.imap.rate_requests {
+            if data
                 .server
                 .core
                 .storage
@@ -310,7 +310,7 @@
                 .is_some()
         {
             return Err(trc::LimitEvent::TooManyRequests.into_err());
-        }
+        }}}
 
         match &request.command {
             Command::Capability | Command::Noop | Command::Logout | Command::Id => Ok(request),
--- a/crates/imap/src/core/mailbox.rs
+++ b/crates/imap/src/core/mailbox.rs
@@ -316,12 +316,12 @@
                         // Add new mailboxes
                         for (mailbox_name, mailbox_id) in new_account.mailbox_names.iter() {
                             if let Some(old_mailbox) = old_account.mailbox_state.get(mailbox_id) {
-                                if let Some(mailbox) = new_account.mailbox_state.get(mailbox_id)
-                                    && (mailbox.total_messages != old_mailbox.total_messages
+                                if let Some(mailbox) = new_account.mailbox_state.get(mailbox_id) {
+                                    if (mailbox.total_messages != old_mailbox.total_messages
                                         || mailbox.total_unseen != old_mailbox.total_unseen)
                                 {
                                     changes.changed.push(mailbox_name.clone());
-                                }
+                                }}
                             } else {
                                 changes.added.push(mailbox_name.clone());
                             }
--- a/crates/imap/src/core/session.rs
+++ b/crates/imap/src/core/session.rs
@@ -28,13 +28,13 @@
         session: SessionData<T>,
     ) -> impl std::future::Future<Output = ()> + Send {
         async move {
-            if let Ok(mut session) = Session::new(session, self).await
-                && session.handle_conn().await
-                && session.instance.acceptor.is_tls()
-                && let Ok(mut session) = session.into_tls().await
+            if let Ok(mut session) = Session::new(session, self).await {
+                if session.handle_conn().await {
+                if session.instance.acceptor.is_tls() {
+                if let Ok(mut session) = session.into_tls().await
             {
                 session.handle_conn().await;
-            }
+            }}}}
         }
     }
 
--- a/crates/imap/src/op/create.rs
+++ b/crates/imap/src/op/create.rs
@@ -85,11 +85,11 @@
         for (pos, &path_item) in params.path.iter().enumerate() {
             let mut mailbox = email::mailbox::Mailbox::new(path_item).with_parent_id(parent_id);
 
-            if pos == params.path.len() - 1
-                && let Some(mailbox_role) = arguments.mailbox_role.map(attr_to_role)
+            if pos == params.path.len() - 1 {
+                if let Some(mailbox_role) = arguments.mailbox_role.map(attr_to_role)
             {
                 mailbox.role = mailbox_role;
-            }
+            }}
             let mailbox_id = next_document_id;
             next_document_id -= 1;
             batch
--- a/crates/imap/src/op/fetch.rs
+++ b/crates/imap/src/op/fetch.rs
@@ -540,8 +540,8 @@
             self.write_bytes(buf).await?;
 
             // Add to set flags
-            if set_seen_flag
-                && let Some(data_) = self
+            if set_seen_flag {
+                if let Some(data_) = self
                     .server
                     .get_archive(account_id, Collection::Email, id)
                     .await
@@ -566,7 +566,7 @@
                     )
                     .imap_ctx(&arguments.tag, trc::location!())?
                     .commit_point();
-            }
+            }}
         }
 
         // Set Seen ids
@@ -940,8 +940,8 @@
                         None
                     }?;
 
-                    if let ArchivedMetadataPartType::Message(nested_message_id) = &part.body
-                        && let Some((
+                    if let ArchivedMetadataPartType::Message(nested_message_id) = &part.body {
+                        if let Some((
                             _,
                             Section::Part { .. }
                             | Section::Header
@@ -952,7 +952,7 @@
                         message = self.message_id(*nested_message_id);
                         part = message.root_part();
                         message_id = u16::from(nested_message_id) as usize;
-                    }
+                    }}
                 }
                 Section::Header => {
                     return Some(
--- a/crates/imap/src/op/subscribe.rs
+++ b/crates/imap/src/op/subscribe.rs
@@ -76,8 +76,8 @@
         // Verify if mailbox is already subscribed/unsubscribed
         for account in self.mailboxes.lock().iter_mut() {
             if account.account_id == account_id {
-                if let Some(mailbox) = account.mailbox_state.get(&mailbox_id)
-                    && mailbox.is_subscribed == subscribe
+                if let Some(mailbox) = account.mailbox_state.get(&mailbox_id) {
+                    if mailbox.is_subscribed == subscribe
                 {
                     return Err(trc::ImapEvent::Error
                         .into_err()
@@ -87,7 +87,7 @@
                             "Mailbox is already unsubscribed."
                         })
                         .id(tag));
-                }
+                }}
                 break;
             }
         }
--- a/crates/imap/src/op/thread.rs
+++ b/crates/imap/src/op/thread.rs
@@ -89,11 +89,11 @@
         let mut threads: AHashMap<u32, Vec<u32>> = AHashMap::new();
         let state = mailbox.state.lock();
         for item in &cache.emails.items {
-            if result_set.results.contains(item.document_id)
-                && let Some((imap_id, _)) = state.map_result_id(item.document_id, is_uid)
+            if result_set.results.contains(item.document_id) {
+                if let Some((imap_id, _)) = state.map_result_id(item.document_id, is_uid)
             {
                 threads.entry(item.thread_id).or_default().push(imap_id);
-            }
+            }}
         }
 
         let mut threads = threads
--- a/crates/smtp/src/inbound/data.rs
+++ b/crates/smtp/src/inbound/data.rs
@@ -388,8 +388,8 @@
         }
 
         // Add Received-SPF header
-        if let Some(spf_output) = &self.data.spf_mail_from
-            && self
+        if let Some(spf_output) = &self.data.spf_mail_from {
+            if self
                 .server
                 .eval_if(&dc.add_received_spf, self, self.data.session_id)
                 .await
@@ -403,12 +403,12 @@
                 &self.hostname,
             )
             .write_header(&mut headers);
-        }
+        }}
 
         // ARC Seal
-        if let (Some(arc_sealer), Some(arc_output)) = (arc_sealer, &arc_output)
-            && !dkim_output.is_empty()
-            && arc_output.can_be_sealed()
+        if let (Some(arc_sealer), Some(arc_output)) = (arc_sealer, &arc_output) {
+            if !dkim_output.is_empty() {
+            if arc_output.can_be_sealed()
         {
             match arc_sealer.seal(&auth_message, &auth_results, arc_output) {
                 Ok(set) => {
@@ -422,7 +422,7 @@
                     );
                 }
             }
-        }
+        }}}
 
         // Run SPAM filter
         if self.server.core.spam.enabled
--- a/crates/smtp/src/inbound/ehlo.rs
+++ b/crates/smtp/src/inbound/ehlo.rs
@@ -97,8 +97,8 @@
                     self.server
                         .get_trusted_sieve_script(&name, self.data.session_id)
                         .map(|s| (s, name))
-                })
-                && let ScriptResult::Reject(message) = self
+                }) {
+                if let ScriptResult::Reject(message) = self
                     .run_script(
                         script_id,
                         script.clone(),
@@ -110,7 +110,7 @@
                 self.data.helo_domain = prev_helo_domain;
                 self.data.spf_ehlo = None;
                 return self.write(message.as_bytes()).await;
-            }
+            }}
 
             // Milter filtering
             if let Err(message) = self.run_milters(Stage::Ehlo, None).await {
--- a/crates/smtp/src/inbound/spawn.rs
+++ b/crates/smtp/src/inbound/spawn.rs
@@ -46,11 +46,11 @@
         if session.is_allowed().await
             && session.init_conn().await
             && session.handle_conn().await
-            && session.instance.acceptor.is_tls()
-            && let Ok(mut session) = session.into_tls().await
+            && session.instance.acceptor.is_tls() {
+            if let Ok(mut session) = session.into_tls().await
         {
             session.handle_conn().await;
-        }
+        }}
     }
 
     #[allow(clippy::manual_async_fn)]
@@ -87,8 +87,8 @@
                 self.server
                     .get_trusted_sieve_script(&name, self.data.session_id)
                     .map(|s| (s, name))
-            })
-            && let ScriptResult::Reject(message) = self
+            }) {
+            if let ScriptResult::Reject(message) = self
                 .run_script(
                     script_id,
                     script.clone(),
@@ -98,7 +98,7 @@
         {
             let _ = self.write(message.as_bytes()).await;
             return false;
-        }
+        }}
 
         // Milter filtering
         if let Err(message) = self.run_milters(Stage::Connect, None).await {
--- a/crates/smtp/src/outbound/delivery.rs
+++ b/crates/smtp/src/outbound/delivery.rs
@@ -1030,8 +1030,8 @@
                                     );
 
                                     // Verify DANE
-                                    if let Some(dane_policy) = &dane_policy
-                                        && let Err(status) = dane_policy.verify(
+                                    if let Some(dane_policy) = &dane_policy {
+                                        if let Err(status) = dane_policy.verify(
                                             message.span_id,
                                             envelope.mx,
                                             smtp_client.tls_connection().peer_certificates(),
@@ -1060,7 +1060,7 @@
 
                                         last_status = status;
                                         continue 'next_host;
-                                    }
+                                    }}
 
                                     // Report TLS success
                                     if let Some(tls_report) = &tls_report {
--- a/crates/smtp/src/outbound/mta_sts/lookup.rs
+++ b/crates/smtp/src/outbound/mta_sts/lookup.rs
@@ -59,11 +59,11 @@
         };
 
         // Check if the policy has been cached
-        if let Some(value) = self.inner.cache.dbs_mta_sts.get(domain)
-            && value.id == record.id
+        if let Some(value) = self.inner.cache.dbs_mta_sts.get(domain) {
+            if value.id == record.id
         {
             return Ok(value);
-        }
+        }}
 
         // Fetch policy
         #[cfg(not(feature = "test_mode"))]
--- a/crates/smtp/src/outbound/mta_sts/verify.rs
+++ b/crates/smtp/src/outbound/mta_sts/verify.rs
@@ -22,11 +22,11 @@
                         }
                     }
                     MxPattern::StartsWith(domain) => {
-                        if let Some((_, suffix)) = mx_host.split_once('.')
-                            && suffix == domain
+                        if let Some((_, suffix)) = mx_host.split_once('.') {
+                            if suffix == domain
                         {
                             return true;
-                        }
+                        }}
                     }
                 }
             }
--- a/crates/smtp/src/queue/dsn.rs
+++ b/crates/smtp/src/queue/dsn.rs
@@ -396,14 +396,14 @@
         let now = now();
 
         for rcpt in &mut self.message.recipients {
-            if !rcpt.has_flag(RCPT_DSN_SENT | RCPT_NOTIFY_NEVER)
-                && let Status::PermanentFailure(err) = &rcpt.status
+            if !rcpt.has_flag(RCPT_DSN_SENT | RCPT_NOTIFY_NEVER) {
+                if let Status::PermanentFailure(err) = &rcpt.status
             {
                 rcpt.flags |= RCPT_DSN_SENT;
                 let mut dsn = String::new();
                 err.write_dsn_text(&rcpt.address, &mut dsn);
                 is_double_bounce.push(dsn);
-            }
+            }}
 
             if rcpt.notify.due <= now {
                 rcpt.notify.due = rcpt
@@ -529,13 +529,13 @@
     }
 
     fn write_dsn_will_retry_until(&self, created: u64, dsn: &mut String) {
-        if let Some(expires) = self.expiration_time(created)
-            && expires > now()
+        if let Some(expires) = self.expiration_time(created) {
+            if expires > now()
         {
             dsn.push_str("Will-Retry-Until: ");
             dsn.push_str(&DateTime::from_timestamp(expires as i64).to_rfc822());
             dsn.push_str("\r\n");
-        }
+        }}
     }
 }
 
@@ -624,11 +624,11 @@
     }
 
     fn write_dsn_diagnostic(&self, dsn: &mut String) {
-        if let Status::PermanentFailure(err) | Status::TemporaryFailure(err) = self
-            && let Error::UnexpectedResponse(response) = &err.details
+        if let Status::PermanentFailure(err) | Status::TemporaryFailure(err) = self {
+            if let Error::UnexpectedResponse(response) = &err.details
         {
             response.response.write_dsn_diagnostic(dsn);
-        }
+        }}
     }
 }
 
--- a/crates/smtp/src/reporting/tls.rs
+++ b/crates/smtp/src/reporting/tls.rs
@@ -303,11 +303,11 @@
                 continue;
             };
 
-            if let Some(serialized_size) = serialized_size.as_deref_mut()
-                && serde::Serialize::serialize(&tls, serialized_size).is_err()
+            if let Some(serialized_size) = serialized_size.as_deref_mut() {
+                if serde::Serialize::serialize(&tls, serialized_size).is_err()
             {
                 continue;
-            }
+            }}
 
             // Group duplicates
             let mut total_success = 0;
--- a/crates/pop3/src/session.rs
+++ b/crates/pop3/src/session.rs
@@ -48,11 +48,11 @@
                 .await
                 .is_ok()
                 && session.handle_conn().await
-                && session.instance.acceptor.is_tls()
-                && let Ok(mut session) = session.into_tls().await
+                && session.instance.acceptor.is_tls() {
+                if let Ok(mut session) = session.into_tls().await
             {
                 session.handle_conn().await;
-            }
+            }}
         }
     }
 
@@ -189,10 +189,10 @@
 
         trc::error!(err.span_id(self.session_id));
 
-        if write_err && let Err(err) = self.write_bytes(response).await {
+        if write_err { if let Err(err) = self.write_bytes(response).await {
             trc::error!(err.span_id(self.session_id));
             return false;
-        }
+        }}
 
         !disconnect
     }
--- a/crates/managesieve/src/core/client.rs
+++ b/crates/managesieve/src/core/client.rs
@@ -132,14 +132,14 @@
             }
         }
 
-        if let Some(needs_literal) = needs_literal
-            && let Err(err) = self
+        if let Some(needs_literal) = needs_literal {
+            if let Err(err) = self
                 .write(format!("OK Ready for {} bytes.\r\n", needs_literal).as_bytes())
                 .await
         {
             trc::error!(err.span_id(self.session_id));
             return SessionResult::Close;
-        }
+        }}
 
         SessionResult::Continue
     }
--- a/crates/managesieve/src/core/session.rs
+++ b/crates/managesieve/src/core/session.rs
@@ -41,14 +41,14 @@
                 .await
                 .is_ok()
                 && session.handle_conn().await
-                && session.instance.acceptor.is_tls()
-                && let Ok(mut session) = session.into_tls().await
+                && session.instance.acceptor.is_tls() {
+                if let Ok(mut session) = session.into_tls().await
             {
                 let _ = session
                     .write(&session.handle_capability(SERVER_GREETING).await.unwrap())
                     .await;
                 session.handle_conn().await;
-            }
+            }}
         }
     }
 
--- a/crates/services/src/housekeeper/mod.rs
+++ b/crates/services/src/housekeeper/mod.rs
@@ -98,12 +98,12 @@
             }
 
             // OTEL Push Metrics
-            if server.core.network.roles.push_metrics
-                && let Some(otel) = &server.core.metrics.otel
+            if server.core.network.roles.push_metrics {
+                if let Some(otel) = &server.core.metrics.otel
             {
                 OtelMetrics::enable_errors();
                 queue.schedule(Instant::now() + otel.interval, ActionClass::OtelMetrics);
-            }
+            }}
 
             // Calculate expensive metrics
             queue.schedule(Instant::now(), ActionClass::CalculateMetrics);
@@ -200,19 +200,19 @@
                                 }
 
                                 if let Some(metrics_store) = enterprise.metrics_store.as_ref()
-                                    && !queue.has_action(&ActionClass::InternalMetrics)
+                                    { if !queue.has_action(&ActionClass::InternalMetrics)
                                 {
                                     queue.schedule(
                                         Instant::now() + metrics_store.interval.time_to_next(),
                                         ActionClass::InternalMetrics,
                                     );
-                                }
+                                }}
 
                                 if !enterprise.metrics_alerts.is_empty()
-                                    && !queue.has_action(&ActionClass::AlertMetrics)
+                                    { if !queue.has_action(&ActionClass::AlertMetrics)
                                 {
                                     queue.schedule(Instant::now(), ActionClass::AlertMetrics);
-                                }
+                                }}
                             }
                             // SPDX-SnippetEnd
 
@@ -720,17 +720,17 @@
                 // SPDX-License-Identifier: LicenseRef-SEL
                 #[cfg(feature = "enterprise")]
                 if let Some(trace_retention) = trace_retention
-                    && let Err(err) = store.purge_spans(trace_retention).await
+                    { if let Err(err) = store.purge_spans(trace_retention).await
                 {
                     trc::error!(err.details("Failed to purge tracing spans"));
-                }
+                }}
 
                 #[cfg(feature = "enterprise")]
                 if let Some(metrics_retention) = metrics_retention
-                    && let Err(err) = store.purge_metrics(metrics_retention).await
+                    { if let Err(err) = store.purge_metrics(metrics_retention).await
                 {
                     trc::error!(err.details("Failed to purge metrics"));
-                }
+                }}
                 // SPDX-SnippetEnd
             }
             PurgeType::Blobs { store, blob_store } => {
@@ -768,7 +768,7 @@
 
         // Remove lock
         if let Some(lock_name) = &lock_name
-            && let Err(err) = self
+            { if let Err(err) = self
                 .in_memory_store()
                 .remove_lock(KV_LOCK_HOUSEKEEPER, lock_name)
                 .await
@@ -777,7 +777,7 @@
                 err.details("Failed to delete task lock.")
                     .details(lock_type)
             );
-        }
+        }}
     }
 }
 
--- a/crates/services/src/state_manager/manager.rs
+++ b/crates/services/src/state_manager/manager.rs
@@ -75,14 +75,14 @@
                                     .access_to
                                     .iter()
                                     .any(|(id, _)| *id == *shared_account_id)
-                                && let Some(shared_list) =
+                                { if let Some(shared_list) =
                                     shared_accounts_map.get_mut(shared_account_id)
                             {
                                 shared_list.remove(&account_id);
                                 if shared_list.is_empty() {
                                     shared_accounts_map.remove(shared_account_id);
                                 }
-                            }
+                            }}
                         }
                     }
 
@@ -139,8 +139,8 @@
                 } => {
                     // Publish event to cluster
                     if broadcast
-                        && let Some(broadcast_tx) = &inner.ipc.broadcast_tx.clone()
-                        && broadcast_tx
+                        { if let Some(broadcast_tx) = &inner.ipc.broadcast_tx.clone()
+                        { if broadcast_tx
                             .send(BroadcastEvent::StateChange(state_change))
                             .await
                             .is_err()
@@ -150,7 +150,7 @@
                             Details = "Error sending broadcast event.",
                             CausedBy = trc::location!()
                         );
-                    }
+                    }}}
 
                     if let Some(shared_accounts) = shared_accounts_map.get(&state_change.account_id)
                     {
@@ -244,14 +244,14 @@
 
                         for subscriber_id in subscribers.keys() {
                             if let SubscriberId::Push(push_id) = subscriber_id
-                                && !subscriptions.iter().any(|s| {
+                                { if !subscriptions.iter().any(|s| {
                                     matches!(s, UpdateSubscription::Verified(
                                         PushSubscription { id, .. }
                                     ) if id == push_id)
                                 })
                             {
                                 remove_ids.push(*subscriber_id);
-                            }
+                            }}
                         }
 
                         for remove_id in remove_ids {
--- a/crates/migration/src/submission.rs
+++ b/crates/migration/src/submission.rs
@@ -237,7 +237,7 @@
 
 fn convert_envelope_address(envelope: &Value) -> Option<Address> {
     if let Value::Object(envelope) = envelope
-        && let (Value::Text(email), Value::Object(params)) = (
+        { if let (Value::Text(email), Value::Object(params)) = (
             envelope.get(&Property::Email),
             envelope.get(&Property::Parameters),
         )
@@ -248,16 +248,16 @@
         };
         for (k, v) in params.0.iter() {
             if let Property::_T(k) = &k
-                && !k.is_empty()
+                { if !k.is_empty()
             {
                 let k = k.to_string();
                 let v = v.as_string().map(|s| s.to_string());
 
                 addr.parameters.get_or_insert_default().append(k, v);
-            }
+            }}
         }
         return Some(addr);
-    }
+    }}
 
     None
 }
--- a/crates/services/src/task_manager/imip.rs
+++ b/crates/services/src/task_manager/imip.rs
@@ -476,7 +476,7 @@
     if let Some(guests) = fields
         .iter()
         .find(|e| e.name == ICalendarProperty::Attendee)
-        && let ArchivedItipValue::Participants(guests) = &guests.value
+        { if let ArchivedItipValue::Participants(guests) = &guests.value
     {
         variables.insert_single(
             CalendarTemplateVariable::AttendeesTitle,
@@ -507,13 +507,13 @@
                 ]
             }),
         );
-    }
+    }}
 
     // Add RSVP buttons
     if matches!(
         summary,
         ArchivedItipSummary::Invite(_) | ArchivedItipSummary::Update { .. }
-    ) && let Some(rsvp_url) = server
+    ) { if let Some(rsvp_url) = server
         .http_rsvp_url(task.account_id, task.document_id, to)
         .await
     {
@@ -549,7 +549,7 @@
                 ]
             }),
         );
-    }
+    }}
 
     // Add footer
     variables.insert_block(
--- a/crates/jmap/src/changes/state.rs
+++ b/crates/jmap/src/changes/state.rs
@@ -49,10 +49,10 @@
     ) -> trc::Result<State> {
         let old_state: State = self.get_state(account_id, collection).await?;
         if let Some(if_in_state) = if_in_state
-            && &old_state != if_in_state
+            { if &old_state != if_in_state
         {
             return Err(trc::JmapEvent::StateMismatch.into_err());
-        }
+        }}
 
         Ok(old_state)
     }
@@ -70,10 +70,10 @@
     fn assert_state(&self, is_mailbox: bool, if_in_state: &Option<State>) -> trc::Result<State> {
         let old_state: State = self.get_state(is_mailbox);
         if let Some(if_in_state) = if_in_state
-            && &old_state != if_in_state
+            { if &old_state != if_in_state
         {
             return Err(trc::JmapEvent::StateMismatch.into_err());
-        }
+        }}
         Ok(old_state)
     }
 }
--- a/crates/jmap/src/mailbox/query.rs
+++ b/crates/jmap/src/mailbox/query.rs
@@ -183,10 +183,10 @@
                     response.total = Some(total);
                 }
                 if let Some(paginate) = &mut paginate
-                    && paginate.limit > total
+                    { if paginate.limit > total
                 {
                     paginate.limit = total;
-                }
+                }}
                 result_set.results = filtered_ids;
             }
         }
--- a/crates/jmap/src/sieve/set.rs
+++ b/crates/jmap/src/sieve/set.rs
@@ -391,7 +391,7 @@
                     } else if update
                         .as_ref()
                         .is_none_or(|(_, obj)| obj.inner.name != value)
-                        && let Some(id) = self
+                        { if let Some(id) = self
                             .filter(
                                 ctx.resource_token.account_id,
                                 Collection::SieveScript,
@@ -407,7 +407,7 @@
                                 "A sieve script with name '{}' already exists.",
                                 value
                             ))));
-                    }
+                    }}
 
                     changes.name = value;
                 }
--- a/crates/jmap/src/submission/get.rs
+++ b/crates/jmap/src/submission/get.rs
@@ -104,7 +104,7 @@
                 .collect::<VecMap<_, _>>();
             let mut is_pending = false;
             if let Some(queue_id) = submission.queue_id.as_ref().map(u64::from)
-                && let Some(queued_message_) = self
+                { if let Some(queued_message_) = self
                     .read_message_archive(queue_id)
                     .await
                     .caused_by(trc::location!())?
@@ -136,7 +136,7 @@
                         };
                 }
                 is_pending = true;
-            }
+            }}
 
             let mut result = Object::with_capacity(properties.len());
             for property in &properties {
--- a/crates/jmap/src/submission/set.rs
+++ b/crates/jmap/src/submission/set.rs
@@ -512,7 +512,7 @@
                     if let ArchivedHeaderValue::Address(addr) = &header.value {
                         for address in addr.iter() {
                             if let Some(address) = address.address().and_then(sanitize_email)
-                                && !rcpt_to.iter().any(|rcpt| rcpt.address == address)
+                                { if !rcpt_to.iter().any(|rcpt| rcpt.address == address)
                             {
                                 submission.envelope.rcpt_to.push(Address {
                                     email: address.to_string(),
@@ -522,7 +522,7 @@
                                     address,
                                     ..Default::default()
                                 });
-                            }
+                            }}
                         }
                     }
                 }
@@ -697,7 +697,7 @@
 
                     for (k, v) in params.0 {
                         if let Property::_T(k) = k
-                            && !k.is_empty()
+                            { if !k.is_empty()
                         {
                             if !params_text.is_empty() {
                                 params_text.push(' ');
@@ -710,7 +710,7 @@
                             } else {
                                 params_list.append(k, None);
                             }
-                        }
+                        }}
                     }
                     params_text.push('\n');
 
--- a/crates/jmap/src/vacation/set.rs
+++ b/crates/jmap/src/vacation/set.rs
@@ -316,13 +316,13 @@
         } else if !will_destroy.is_empty() {
             for id in will_destroy {
                 if id.is_singleton()
-                    && let Some(document_id) = self.get_vacation_sieve_script_id(account_id).await?
+                    { if let Some(document_id) = self.get_vacation_sieve_script_id(account_id).await?
                 {
                     self.sieve_script_delete(&resource_token, document_id, false, &mut batch)
                         .await?;
                     response.destroyed.push(id);
                     continue;
-                }
+                }}
 
                 response.not_destroyed.append(id, SetError::not_found());
             }
--- a/crates/http/src/auth/authenticate.rs
+++ b/crates/http/src/auth/authenticate.rs
@@ -160,10 +160,10 @@
 }
 
 fn decode_bearer_token(token: &str, allow_api_access: bool) -> Option<Credentials<String>> {
-    if allow_api_access && let Some(token) = token.strip_prefix("api_").and_then(decode_plain_auth)
+    if allow_api_access { if let Some(token) = token.strip_prefix("api_").and_then(decode_plain_auth)
     {
         return Some(token);
-    }
+    }}
 
     Some(Credentials::OAuthBearer {
         token: token.to_string(),
--- a/crates/http/src/autoconfig/mod.rs
+++ b/crates/http/src/autoconfig/mod.rs
@@ -203,19 +203,19 @@
             .email_to_id(emailaddress)
             .await
             .caused_by(trc::location!())?
-            && let Ok(Some(principal)) = self
+            { if let Ok(Some(principal)) = self
                 .core
                 .storage
                 .directory
                 .query(QueryParams::id(id).with_return_member_of(false))
                 .await
-            && principal
+            { if principal
                 .emails
                 .first()
                 .is_some_and(|email| email.eq_ignore_ascii_case(emailaddress))
         {
             account_name = principal.name;
-        }
+        }}}
 
         Ok((account_name, self.core.network.server_name.clone(), domain))
     }
@@ -293,11 +293,11 @@
     }
 
     if let Ok(Event::Text(text)) = reader.read_event_into(&mut buf)
-        && let Ok(text) = text.xml_content()
-        && text.contains('@')
+        { if let Ok(text) = text.xml_content()
+        { if text.contains('@')
     {
         return Ok(text.trim().to_lowercase());
-    }
+    }}}
 
     Err(format!(
         "Expected email address, found unexpected value at position {}.",
--- a/crates/http/src/form/mod.rs
+++ b/crates/http/src/form/mod.rs
@@ -51,8 +51,8 @@
     ) -> trc::Result<HttpResponse> {
         // Validate rate
         if let Some(rate) = &form.rate
-            && !session.remote_ip.is_loopback()
-            && self
+            { if !session.remote_ip.is_loopback()
+            { if self
                 .core
                 .storage
                 .lookup
@@ -67,7 +67,7 @@
                 .is_some()
         {
             return Err(trc::LimitEvent::TooManyRequests.into_err());
-        }
+        }}}
 
         // Validate honeypot
         if form
--- a/crates/http/src/management/principal.rs
+++ b/crates/http/src/management/principal.rs
@@ -169,7 +169,7 @@
 
                 // Set report domain
                 if let Some(report_domain) = report_domain
-                    && let Err(err) = self
+                    { if let Err(err) = self
                         .core
                         .storage
                         .config
@@ -177,7 +177,7 @@
                         .await
                 {
                     trc::error!(err.details("Failed to set report domain"));
-                }
+                }}
 
                 // Increment revision
                 self.invalidate_principal_caches(result.changed_principals)
@@ -205,20 +205,20 @@
                     .split(',')
                 {
                     if let Some(typ) = Type::parse(typ)
-                        && !types.contains(&typ)
+                        { if !types.contains(&typ)
                     {
                         types.push(typ);
-                    }
+                    }}
                 }
 
                 // Parse fields
                 let mut fields = Vec::new();
                 for field in params.get("fields").unwrap_or_default().split(',') {
                     if let Some(field) = PrincipalField::try_parse(field)
-                        && !fields.contains(&field)
+                        { if !fields.contains(&field)
                     {
                         fields.push(field);
-                    }
+                    }}
                 }
 
                 // Validate the access token
--- a/crates/http/src/management/queue.rs
+++ b/crates/http/src/management/queue.rs
@@ -145,7 +145,7 @@
         // Limit to tenant domains
         #[cfg(feature = "enterprise")]
         if self.core.is_enterprise_edition()
-            && let Some(tenant) = access_token.tenant
+            { if let Some(tenant) = access_token.tenant
         {
             tenant_domains = self
                 .core
@@ -162,7 +162,7 @@
                 })
                 .caused_by(trc::location!())?
                 .into();
-        }
+        }}
 
         // SPDX-SnippetEnd
 
--- a/crates/http/src/management/report.rs
+++ b/crates/http/src/management/report.rs
@@ -54,7 +54,7 @@
         // Limit to tenant domains
         #[cfg(feature = "enterprise")]
         if self.core.is_enterprise_edition()
-            && let Some(tenant) = access_token.tenant
+            { if let Some(tenant) = access_token.tenant
         {
             tenant_domains = self
                 .core
@@ -71,7 +71,7 @@
                 })
                 .caused_by(trc::location!())?
                 .into();
-        }
+        }}
 
         // SPDX-SnippetEnd
 
@@ -207,11 +207,11 @@
                         }
 
                         if !batch.is_empty()
-                            && let Err(err) =
+                            { if let Err(err) =
                                 server.core.storage.data.write(batch.build_all()).await
                         {
                             trc::error!(err.caused_by(trc::location!()));
-                        }
+                        }}
                     });
                 }
 
--- a/crates/http/src/management/settings.rs
+++ b/crates/http/src/management/settings.rs
@@ -92,7 +92,7 @@
                     let mut ids = Vec::new();
                     for key in settings.keys() {
                         if let Some(id) = key.strip_suffix(&suffix)
-                            && !id.is_empty()
+                            { if !id.is_empty()
                         {
                             if !has_filter {
                                 if offset == 0 {
@@ -106,7 +106,7 @@
                             } else {
                                 ids.push(id);
                             }
-                        }
+                        }}
                     }
 
                     // Group settings by record id
@@ -319,10 +319,10 @@
                                         return Err(trc::ManageEvent::AssertFailed.into_err());
                                     }
                                 } else if let Some((key, _)) = values.first()
-                                    && self.core.storage.config.get(key).await?.is_some()
+                                    { if self.core.storage.config.get(key).await?.is_some()
                                 {
                                     return Err(trc::ManageEvent::AssertFailed.into_err());
-                                }
+                                }}
                             }
 
                             self.core
--- a/crates/http/src/request.rs
+++ b/crates/http/src/request.rs
@@ -558,7 +558,7 @@
                 "prometheus" => {
                     if let Some(prometheus) = &self.core.metrics.prometheus {
                         if let Some(auth) = &prometheus.auth
-                            && req
+                            { if req
                                 .authorization_basic()
                                 .is_none_or(|secret| secret != auth)
                         {
@@ -566,7 +566,7 @@
                                 .into_err()
                                 .details("Invalid or missing credentials.")
                                 .caused_by(trc::location!()));
-                        }
+                        }}
 
                         return Ok(Resource::new(
                             "text/plain; version=0.0.4",

Reply to: