diff --git a/Cargo.lock b/Cargo.lock index 7dc347e38..6d290be22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1312,7 +1312,6 @@ dependencies = [ "num-derive", "num-traits", "num_cpus", - "once_cell", "parking_lot", "percent-encoding", "pgp", @@ -1362,7 +1361,6 @@ version = "0.0.0" dependencies = [ "anyhow", "chrono", - "once_cell", "regex", "rusqlite", ] @@ -1455,7 +1453,6 @@ dependencies = [ "human-panic", "libc", "num-traits", - "once_cell", "rand 0.8.5", "serde_json", "thiserror 2.0.12", diff --git a/Cargo.toml b/Cargo.toml index 0ad2328e5..e397911f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,7 +72,6 @@ mime = "0.3.17" num_cpus = "1.16" num-derive = "0.4" num-traits = { workspace = true } -once_cell = { workspace = true } parking_lot = "0.12" percent-encoding = "2.3" pgp = { version = "0.15.0", default-features = false } @@ -185,7 +184,6 @@ log = "0.4" mailparse = "0.16.1" nu-ansi-term = "0.46" num-traits = "0.2" -once_cell = "1.21.3" rand = "0.8" regex = "1.10" rusqlite = "0.32" diff --git a/deltachat-contact-tools/Cargo.toml b/deltachat-contact-tools/Cargo.toml index 205773257..ec1f4c756 100644 --- a/deltachat-contact-tools/Cargo.toml +++ b/deltachat-contact-tools/Cargo.toml @@ -9,7 +9,6 @@ license = "MPL-2.0" [dependencies] anyhow = { workspace = true } -once_cell = { workspace = true } regex = { workspace = true } rusqlite = { workspace = true } # Needed in order to `impl rusqlite::types::ToSql for EmailAddress`. Could easily be put behind a feature. chrono = { workspace = true, features = ["alloc", "clock", "std"] } diff --git a/deltachat-contact-tools/src/lib.rs b/deltachat-contact-tools/src/lib.rs index b131e8930..5c54dfe65 100644 --- a/deltachat-contact-tools/src/lib.rs +++ b/deltachat-contact-tools/src/lib.rs @@ -29,12 +29,12 @@ use std::fmt; use std::ops::Deref; +use std::sync::LazyLock; use anyhow::bail; use anyhow::Context as _; use anyhow::Result; use chrono::{DateTime, NaiveDateTime}; -use once_cell::sync::Lazy; use regex::Regex; #[derive(Debug)] @@ -155,7 +155,8 @@ pub fn parse_vcard(vcard: &str) -> Vec { } // Remove line folding, see https://datatracker.ietf.org/doc/html/rfc6350#section-3.2 - static NEWLINE_AND_SPACE_OR_TAB: Lazy = Lazy::new(|| Regex::new("\r?\n[\t ]").unwrap()); + static NEWLINE_AND_SPACE_OR_TAB: LazyLock = + LazyLock::new(|| Regex::new("\r?\n[\t ]").unwrap()); let unfolded_lines = NEWLINE_AND_SPACE_OR_TAB.replace_all(vcard, ""); let mut lines = unfolded_lines.lines().peekable(); @@ -276,7 +277,8 @@ impl rusqlite::types::ToSql for ContactAddress { /// - Removes special characters from the name, see [`sanitize_name()`] /// - Removes the name if it is equal to the address by setting it to "" pub fn sanitize_name_and_addr(name: &str, addr: &str) -> (String, String) { - static ADDR_WITH_NAME_REGEX: Lazy = Lazy::new(|| Regex::new("(.*)<(.*)>").unwrap()); + static ADDR_WITH_NAME_REGEX: LazyLock = + LazyLock::new(|| Regex::new("(.*)<(.*)>").unwrap()); let (name, addr) = if let Some(captures) = ADDR_WITH_NAME_REGEX.captures(addr.as_ref()) { ( if name.is_empty() { diff --git a/deltachat-ffi/Cargo.toml b/deltachat-ffi/Cargo.toml index 21c6de2a6..8aff777a9 100644 --- a/deltachat-ffi/Cargo.toml +++ b/deltachat-ffi/Cargo.toml @@ -24,7 +24,6 @@ tokio = { workspace = true, features = ["rt-multi-thread"] } anyhow = { workspace = true } thiserror = { workspace = true } rand = { workspace = true } -once_cell = { workspace = true } yerpc = { workspace = true, features = ["anyhow_expose"] } [features] diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 622443b45..3ec17cb6d 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -18,7 +18,7 @@ use std::future::Future; use std::ops::Deref; use std::ptr; use std::str::FromStr; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use std::time::{Duration, SystemTime}; use anyhow::Context as _; @@ -38,7 +38,6 @@ use deltachat::{accounts::Accounts, log::LogExt}; use deltachat_jsonrpc::api::CommandApi; use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcSession}; use num_traits::{FromPrimitive, ToPrimitive}; -use once_cell::sync::Lazy; use rand::Rng; use tokio::runtime::Runtime; use tokio::sync::RwLock; @@ -68,7 +67,8 @@ const DC_GCM_INFO_ONLY: u32 = 0x02; /// Struct representing the deltachat context. pub type dc_context_t = Context; -static RT: Lazy = Lazy::new(|| Runtime::new().expect("unable to create tokio runtime")); +static RT: LazyLock = + LazyLock::new(|| Runtime::new().expect("unable to create tokio runtime")); fn block_on(fut: T) -> T::Output where diff --git a/scripts/create-provider-data-rs.py b/scripts/create-provider-data-rs.py index 8e68910de..62c25b1b9 100755 --- a/scripts/create-provider-data-rs.py +++ b/scripts/create-provider-data-rs.py @@ -215,7 +215,7 @@ if __name__ == "__main__": " Config, ConfigDefault, Oauth2Authorizer, Provider, ProviderOptions, Server, Status,\n" "};\n" "use std::collections::HashMap;\n\n" - "use once_cell::sync::Lazy;\n\n" + "use std::sync::LazyLock;\n\n" ) process_dir(Path(sys.argv[1])) @@ -224,7 +224,7 @@ if __name__ == "__main__": out_all += out_domains out_all += "];\n\n" - out_all += "pub(crate) static PROVIDER_IDS: Lazy> = Lazy::new(|| HashMap::from([\n" + out_all += "pub(crate) static PROVIDER_IDS: LazyLock> = LazyLock::new(|| HashMap::from([\n" out_all += out_ids out_all += "]));\n\n" @@ -233,8 +233,8 @@ if __name__ == "__main__": else: now = datetime.datetime.fromisoformat(sys.argv[2]) out_all += ( - "pub static _PROVIDER_UPDATED: Lazy = " - "Lazy::new(|| chrono::NaiveDate::from_ymd_opt(" + "pub static _PROVIDER_UPDATED: LazyLock = " + "LazyLock::new(|| chrono::NaiveDate::from_ymd_opt(" + str(now.year) + ", " + str(now.month) diff --git a/src/authres.rs b/src/authres.rs index 84504d1ee..21879b0f4 100644 --- a/src/authres.rs +++ b/src/authres.rs @@ -4,12 +4,12 @@ use std::borrow::Cow; use std::collections::BTreeSet; use std::fmt; +use std::sync::LazyLock; use anyhow::Result; use deltachat_contact_tools::EmailAddress; use mailparse::MailHeaderMap; use mailparse::ParsedMail; -use once_cell::sync::Lazy; use crate::config::Config; use crate::context::Context; @@ -107,7 +107,8 @@ fn remove_comments(header: &str) -> Cow<'_, str> { // In Pomsky, this is: // "(" Codepoint* lazy ")" // See https://playground.pomsky-lang.org/?text=%22(%22%20Codepoint*%20lazy%20%22)%22 - static RE: Lazy = Lazy::new(|| regex::Regex::new(r"\([\s\S]*?\)").unwrap()); + static RE: LazyLock = + LazyLock::new(|| regex::Regex::new(r"\([\s\S]*?\)").unwrap()); RE.replace_all(header, " ") } diff --git a/src/chatlist.rs b/src/chatlist.rs index a56b5d3c1..eb1f278b2 100644 --- a/src/chatlist.rs +++ b/src/chatlist.rs @@ -1,7 +1,7 @@ //! # Chat list module. use anyhow::{ensure, Context as _, Result}; -use once_cell::sync::Lazy; +use std::sync::LazyLock; use crate::chat::{update_special_chat_names, Chat, ChatId, ChatVisibility}; use crate::constants::{ @@ -17,8 +17,8 @@ use crate::summary::Summary; use crate::tools::IsNoneOrEmpty; /// Regex to find out if a query should filter by unread messages. -pub static IS_UNREAD_FILTER: Lazy = - Lazy::new(|| regex::Regex::new(r"\bis:unread\b").unwrap()); +pub static IS_UNREAD_FILTER: LazyLock = + LazyLock::new(|| regex::Regex::new(r"\bis:unread\b").unwrap()); /// An object representing a single chatlist in memory. /// diff --git a/src/constants.rs b/src/constants.rs index e26f17b5a..389fed53b 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -2,14 +2,16 @@ #![allow(missing_docs)] +use std::sync::LazyLock; + use deltachat_derive::{FromSql, ToSql}; -use once_cell::sync::Lazy; use percent_encoding::{AsciiSet, NON_ALPHANUMERIC}; use serde::{Deserialize, Serialize}; use crate::chat::ChatId; -pub static DC_VERSION_STR: Lazy = Lazy::new(|| env!("CARGO_PKG_VERSION").to_string()); +pub static DC_VERSION_STR: LazyLock = + LazyLock::new(|| env!("CARGO_PKG_VERSION").to_string()); /// Set of characters to percent-encode in email addresses and names. pub(crate) const NON_ALPHANUMERIC_WITHOUT_DOT: &AsciiSet = &NON_ALPHANUMERIC.remove(b'.'); diff --git a/src/dehtml.rs b/src/dehtml.rs index 8ae56240e..b7f742ee0 100644 --- a/src/dehtml.rs +++ b/src/dehtml.rs @@ -3,8 +3,8 @@ //! A module to remove HTML tags from the email text use std::io::BufRead; +use std::sync::LazyLock; -use once_cell::sync::Lazy; use quick_xml::{ events::{BytesEnd, BytesStart, BytesText}, Reader, @@ -176,7 +176,8 @@ fn dehtml_quick_xml(buf: &str) -> (String, String) { } fn dehtml_text_cb(event: &BytesText, dehtml: &mut Dehtml) { - static LINE_RE: Lazy = Lazy::new(|| regex::Regex::new(r"(\r?\n)+").unwrap()); + static LINE_RE: LazyLock = + LazyLock::new(|| regex::Regex::new(r"(\r?\n)+").unwrap()); if dehtml.get_add_text() == AddText::YesPreserveLineEnds || dehtml.get_add_text() == AddText::YesRemoveLineEnds diff --git a/src/key.rs b/src/key.rs index 95a1fef8e..adcba37c9 100644 --- a/src/key.rs +++ b/src/key.rs @@ -456,15 +456,13 @@ impl std::str::FromStr for Fingerprint { #[cfg(test)] mod tests { - use std::sync::Arc; - - use once_cell::sync::Lazy; + use std::sync::{Arc, LazyLock}; use super::*; use crate::config::Config; use crate::test_utils::{alice_keypair, TestContext}; - static KEYPAIR: Lazy = Lazy::new(alice_keypair); + static KEYPAIR: LazyLock = LazyLock::new(alice_keypair); #[test] fn test_from_armored_string() { diff --git a/src/net/dns.rs b/src/net/dns.rs index 5a24a1111..9af780ed7 100644 --- a/src/net/dns.rs +++ b/src/net/dns.rs @@ -44,13 +44,13 @@ use anyhow::{Context as _, Result}; use std::collections::HashMap; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use std::str::FromStr; +use std::sync::LazyLock; use tokio::net::lookup_host; use tokio::time::timeout; use super::load_connection_timestamp; use crate::context::Context; use crate::tools::time; -use once_cell::sync::Lazy; /// Inserts entry into DNS cache /// or updates existing one with a new timestamp. @@ -90,8 +90,8 @@ pub(crate) async fn prune_dns_cache(context: &Context) -> Result<()> { /// /// and /// . -static LOOKUP_HOST_CACHE: Lazy>>> = - Lazy::new(Default::default); +static LOOKUP_HOST_CACHE: LazyLock>>> = + LazyLock::new(Default::default); /// Wrapper for `lookup_host` that returns IP addresses. async fn lookup_ips(host: impl tokio::net::ToSocketAddrs) -> Result> { @@ -229,7 +229,7 @@ pub(crate) async fn update_connect_timestamp( /// /// See and /// for reasons. -static DNS_PRELOAD: Lazy>> = Lazy::new(|| { +static DNS_PRELOAD: LazyLock>> = LazyLock::new(|| { HashMap::from([ ( "mail.sangham.net", diff --git a/src/pgp.rs b/src/pgp.rs index 2973bab27..9ef6c36ad 100644 --- a/src/pgp.rs +++ b/src/pgp.rs @@ -424,7 +424,7 @@ pub async fn symm_decrypt( #[cfg(test)] mod tests { - use once_cell::sync::Lazy; + use std::sync::LazyLock; use tokio::sync::OnceCell; use super::*; @@ -502,7 +502,7 @@ mod tests { static CLEARTEXT: &[u8] = b"This is a test"; /// Initialised [TestKeys] for tests. - static KEYS: Lazy = Lazy::new(TestKeys::new); + static KEYS: LazyLock = LazyLock::new(TestKeys::new); static CTEXT_SIGNED: OnceCell = OnceCell::const_new(); static CTEXT_UNSIGNED: OnceCell = OnceCell::const_new(); diff --git a/src/plaintext.rs b/src/plaintext.rs index d59ac80a5..349b02021 100644 --- a/src/plaintext.rs +++ b/src/plaintext.rs @@ -1,6 +1,6 @@ //! Handle plain text together with some attributes. -use once_cell::sync::Lazy; +use std::sync::LazyLock; use crate::simplify::remove_message_footer; @@ -25,10 +25,10 @@ impl PlainText { /// Convert plain text to HTML. /// The function handles quotes, links, fixed and floating text paragraphs. pub fn to_html(&self) -> String { - static LINKIFY_MAIL_RE: Lazy = - Lazy::new(|| regex::Regex::new(r"\b([\w.\-+]+@[\w.\-]+)\b").unwrap()); + static LINKIFY_MAIL_RE: LazyLock = + LazyLock::new(|| regex::Regex::new(r"\b([\w.\-+]+@[\w.\-]+)\b").unwrap()); - static LINKIFY_URL_RE: Lazy = Lazy::new(|| { + static LINKIFY_URL_RE: LazyLock = LazyLock::new(|| { regex::Regex::new(r"\b((http|https|ftp|ftps):[\w.,:;$/@!?&%\-~=#+]+)").unwrap() }); diff --git a/src/provider/data.rs b/src/provider/data.rs index 4d52ac2c0..269137e79 100644 --- a/src/provider/data.rs +++ b/src/provider/data.rs @@ -8,7 +8,7 @@ use crate::provider::{ }; use std::collections::HashMap; -use once_cell::sync::Lazy; +use std::sync::LazyLock; // 163.md: 163.com static P_163: Provider = Provider { @@ -2406,84 +2406,85 @@ pub(crate) static PROVIDER_DATA: [(&str, &Provider); 533] = [ ("zoho.com", &P_ZOHO), ]; -pub(crate) static PROVIDER_IDS: Lazy> = Lazy::new(|| { - HashMap::from([ - ("163", &P_163), - ("aktivix.org", &P_AKTIVIX_ORG), - ("aliyun", &P_ALIYUN), - ("aol", &P_AOL), - ("arcor.de", &P_ARCOR_DE), - ("autistici.org", &P_AUTISTICI_ORG), - ("blindzeln.org", &P_BLINDZELN_ORG), - ("bluewin.ch", &P_BLUEWIN_CH), - ("buzon.uy", &P_BUZON_UY), - ("chello.at", &P_CHELLO_AT), - ("comcast", &P_COMCAST), - ("daleth.cafe", &P_DALETH_CAFE), - ("dismail.de", &P_DISMAIL_DE), - ("disroot", &P_DISROOT), - ("e.email", &P_E_EMAIL), - ("espiv.net", &P_ESPIV_NET), - ("example.com", &P_EXAMPLE_COM), - ("fastmail", &P_FASTMAIL), - ("firemail.de", &P_FIREMAIL_DE), - ("five.chat", &P_FIVE_CHAT), - ("freenet.de", &P_FREENET_DE), - ("gmail", &P_GMAIL), - ("gmx.net", &P_GMX_NET), - ("hermes.radio", &P_HERMES_RADIO), - ("hey.com", &P_HEY_COM), - ("i.ua", &P_I_UA), - ("i3.net", &P_I3_NET), - ("icloud", &P_ICLOUD), - ("infomaniak.com", &P_INFOMANIAK_COM), - ("kolst.com", &P_KOLST_COM), - ("kontent.com", &P_KONTENT_COM), - ("mail.com", &P_MAIL_COM), - ("mail.de", &P_MAIL_DE), - ("mail.ru", &P_MAIL_RU), - ("mail2tor", &P_MAIL2TOR), - ("mailbox.org", &P_MAILBOX_ORG), - ("mailo.com", &P_MAILO_COM), - ("mehl.cloud", &P_MEHL_CLOUD), - ("mehl.store", &P_MEHL_STORE), - ("migadu", &P_MIGADU), - ("nauta.cu", &P_NAUTA_CU), - ("naver", &P_NAVER), - ("nine.testrun.org", &P_NINE_TESTRUN_ORG), - ("nubo.coop", &P_NUBO_COOP), - ("outlook.com", &P_OUTLOOK_COM), - ("ouvaton.coop", &P_OUVATON_COOP), - ("posteo", &P_POSTEO), - ("protonmail", &P_PROTONMAIL), - ("purelymail.com", &P_PURELYMAIL_COM), - ("qq", &P_QQ), - ("rambler.ru", &P_RAMBLER_RU), - ("riseup.net", &P_RISEUP_NET), - ("rogers.com", &P_ROGERS_COM), - ("sonic", &P_SONIC), - ("stinpriza.net", &P_STINPRIZA_NET), - ("systemausfall.org", &P_SYSTEMAUSFALL_ORG), - ("systemli.org", &P_SYSTEMLI_ORG), - ("t-online", &P_T_ONLINE), - ("testrun", &P_TESTRUN), - ("tiscali.it", &P_TISCALI_IT), - ("tutanota", &P_TUTANOTA), - ("ukr.net", &P_UKR_NET), - ("undernet.uy", &P_UNDERNET_UY), - ("vfemail", &P_VFEMAIL), - ("vivaldi", &P_VIVALDI), - ("vk.com", &P_VK_COM), - ("vodafone.de", &P_VODAFONE_DE), - ("web.de", &P_WEB_DE), - ("wkpb.de", &P_WKPB_DE), - ("yahoo", &P_YAHOO), - ("yandex.ru", &P_YANDEX_RU), - ("yggmail", &P_YGGMAIL), - ("ziggo.nl", &P_ZIGGO_NL), - ("zoho", &P_ZOHO), - ]) -}); +pub(crate) static PROVIDER_IDS: LazyLock> = + LazyLock::new(|| { + HashMap::from([ + ("163", &P_163), + ("aktivix.org", &P_AKTIVIX_ORG), + ("aliyun", &P_ALIYUN), + ("aol", &P_AOL), + ("arcor.de", &P_ARCOR_DE), + ("autistici.org", &P_AUTISTICI_ORG), + ("blindzeln.org", &P_BLINDZELN_ORG), + ("bluewin.ch", &P_BLUEWIN_CH), + ("buzon.uy", &P_BUZON_UY), + ("chello.at", &P_CHELLO_AT), + ("comcast", &P_COMCAST), + ("daleth.cafe", &P_DALETH_CAFE), + ("dismail.de", &P_DISMAIL_DE), + ("disroot", &P_DISROOT), + ("e.email", &P_E_EMAIL), + ("espiv.net", &P_ESPIV_NET), + ("example.com", &P_EXAMPLE_COM), + ("fastmail", &P_FASTMAIL), + ("firemail.de", &P_FIREMAIL_DE), + ("five.chat", &P_FIVE_CHAT), + ("freenet.de", &P_FREENET_DE), + ("gmail", &P_GMAIL), + ("gmx.net", &P_GMX_NET), + ("hermes.radio", &P_HERMES_RADIO), + ("hey.com", &P_HEY_COM), + ("i.ua", &P_I_UA), + ("i3.net", &P_I3_NET), + ("icloud", &P_ICLOUD), + ("infomaniak.com", &P_INFOMANIAK_COM), + ("kolst.com", &P_KOLST_COM), + ("kontent.com", &P_KONTENT_COM), + ("mail.com", &P_MAIL_COM), + ("mail.de", &P_MAIL_DE), + ("mail.ru", &P_MAIL_RU), + ("mail2tor", &P_MAIL2TOR), + ("mailbox.org", &P_MAILBOX_ORG), + ("mailo.com", &P_MAILO_COM), + ("mehl.cloud", &P_MEHL_CLOUD), + ("mehl.store", &P_MEHL_STORE), + ("migadu", &P_MIGADU), + ("nauta.cu", &P_NAUTA_CU), + ("naver", &P_NAVER), + ("nine.testrun.org", &P_NINE_TESTRUN_ORG), + ("nubo.coop", &P_NUBO_COOP), + ("outlook.com", &P_OUTLOOK_COM), + ("ouvaton.coop", &P_OUVATON_COOP), + ("posteo", &P_POSTEO), + ("protonmail", &P_PROTONMAIL), + ("purelymail.com", &P_PURELYMAIL_COM), + ("qq", &P_QQ), + ("rambler.ru", &P_RAMBLER_RU), + ("riseup.net", &P_RISEUP_NET), + ("rogers.com", &P_ROGERS_COM), + ("sonic", &P_SONIC), + ("stinpriza.net", &P_STINPRIZA_NET), + ("systemausfall.org", &P_SYSTEMAUSFALL_ORG), + ("systemli.org", &P_SYSTEMLI_ORG), + ("t-online", &P_T_ONLINE), + ("testrun", &P_TESTRUN), + ("tiscali.it", &P_TISCALI_IT), + ("tutanota", &P_TUTANOTA), + ("ukr.net", &P_UKR_NET), + ("undernet.uy", &P_UNDERNET_UY), + ("vfemail", &P_VFEMAIL), + ("vivaldi", &P_VIVALDI), + ("vk.com", &P_VK_COM), + ("vodafone.de", &P_VODAFONE_DE), + ("web.de", &P_WEB_DE), + ("wkpb.de", &P_WKPB_DE), + ("yahoo", &P_YAHOO), + ("yandex.ru", &P_YANDEX_RU), + ("yggmail", &P_YGGMAIL), + ("ziggo.nl", &P_ZIGGO_NL), + ("zoho", &P_ZOHO), + ]) + }); -pub static _PROVIDER_UPDATED: Lazy = - Lazy::new(|| chrono::NaiveDate::from_ymd_opt(2024, 9, 13).unwrap()); +pub static _PROVIDER_UPDATED: LazyLock = + LazyLock::new(|| chrono::NaiveDate::from_ymd_opt(2024, 9, 13).unwrap()); diff --git a/src/qr.rs b/src/qr.rs index 27117fe83..9ac6dbb5a 100644 --- a/src/qr.rs +++ b/src/qr.rs @@ -2,11 +2,11 @@ mod dclogin_scheme; use std::collections::BTreeMap; +use std::sync::LazyLock; use anyhow::{anyhow, bail, ensure, Context as _, Result}; pub use dclogin_scheme::LoginOptions; use deltachat_contact_tools::{addr_normalize, may_be_valid_addr, ContactAddress}; -use once_cell::sync::Lazy; use percent_encoding::{percent_decode_str, percent_encode, NON_ALPHANUMERIC}; use serde::Deserialize; @@ -915,10 +915,10 @@ async fn decode_matmsg(context: &Context, qr: &str) -> Result { Qr::from_address(context, name, &addr, None).await } -static VCARD_NAME_RE: Lazy = - Lazy::new(|| regex::Regex::new(r"(?m)^N:([^;]*);([^;\n]*)").unwrap()); -static VCARD_EMAIL_RE: Lazy = - Lazy::new(|| regex::Regex::new(r"(?m)^EMAIL([^:\n]*):([^;\n]*)").unwrap()); +static VCARD_NAME_RE: LazyLock = + LazyLock::new(|| regex::Regex::new(r"(?m)^N:([^;]*);([^;\n]*)").unwrap()); +static VCARD_EMAIL_RE: LazyLock = + LazyLock::new(|| regex::Regex::new(r"(?m)^EMAIL([^:\n]*):([^;\n]*)").unwrap()); /// Extract address for the vcard scheme. /// diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 54afbde67..5c4a89f00 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -2,6 +2,7 @@ use std::collections::HashSet; use std::iter; +use std::sync::LazyLock; use anyhow::{Context as _, Result}; use data_encoding::BASE32_NOPAD; @@ -9,7 +10,6 @@ use deltachat_contact_tools::{addr_cmp, may_be_valid_addr, sanitize_single_line, use iroh_gossip::proto::TopicId; use mailparse::SingleInfo; use num_traits::FromPrimitive; -use once_cell::sync::Lazy; use regex::Regex; use crate::aheader::EncryptPreference; @@ -2717,7 +2717,7 @@ async fn group_changes_msgs( Ok(group_changes_msgs) } -static LIST_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^(.+)<(.+)>$").unwrap()); +static LIST_ID_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"^(.+)<(.+)>$").unwrap()); fn mailinglist_header_listid(list_id_header: &str) -> Result { Ok(match LIST_ID_REGEX.captures(list_id_header) { @@ -2825,8 +2825,8 @@ fn compute_mailinglist_name( // (as that part is much more visible, we assume, that names is shorter and comes more to the point, // than the sometimes longer part from ListId) let subject = mime_parser.get_subject().unwrap_or_default(); - static SUBJECT: Lazy = - Lazy::new(|| Regex::new(r"^.{0,5}\[(.+?)\](\s*\[.+\])?").unwrap()); // remove square brackets around first name + static SUBJECT: LazyLock = + LazyLock::new(|| Regex::new(r"^.{0,5}\[(.+?)\](\s*\[.+\])?").unwrap()); // remove square brackets around first name if let Some(cap) = SUBJECT.captures(&subject) { name = cap[1].to_string() + cap.get(2).map_or("", |m| m.as_str()); } @@ -2853,8 +2853,8 @@ fn compute_mailinglist_name( // but strip some known, long hash prefixes if name.is_empty() { // 51231231231231231231231232869f58.xing.com -> xing.com - static PREFIX_32_CHARS_HEX: Lazy = - Lazy::new(|| Regex::new(r"([0-9a-fA-F]{32})\.(.{6,})").unwrap()); + static PREFIX_32_CHARS_HEX: LazyLock = + LazyLock::new(|| Regex::new(r"([0-9a-fA-F]{32})\.(.{6,})").unwrap()); if let Some(cap) = PREFIX_32_CHARS_HEX .captures(listid) .and_then(|caps| caps.get(2)) diff --git a/src/release.rs b/src/release.rs index 0545079ec..5b5cf6082 100644 --- a/src/release.rs +++ b/src/release.rs @@ -1,10 +1,10 @@ //! DC release info. use chrono::NaiveDate; -use once_cell::sync::Lazy; +use std::sync::LazyLock; const DATE_STR: &str = include_str!("../release-date.in"); /// Last release date. -pub static DATE: Lazy = - Lazy::new(|| NaiveDate::parse_from_str(DATE_STR, "%Y-%m-%d").unwrap()); +pub static DATE: LazyLock = + LazyLock::new(|| NaiveDate::parse_from_str(DATE_STR, "%Y-%m-%d").unwrap()); diff --git a/src/test_utils.rs b/src/test_utils.rs index 4964d5481..2c6eb24f5 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -6,14 +6,13 @@ use std::fmt::Write; use std::ops::{Deref, DerefMut}; use std::panic; use std::path::Path; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use std::time::{Duration, Instant}; use async_channel::{self as channel, Receiver, Sender}; use chat::ChatItem; use deltachat_contact_tools::{ContactAddress, EmailAddress}; use nu_ansi_term::Color; -use once_cell::sync::Lazy; use pretty_assertions::assert_eq; use rand::Rng; use tempfile::{tempdir, TempDir}; @@ -47,8 +46,8 @@ use crate::tools::time; pub const AVATAR_900x900_BYTES: &[u8] = include_bytes!("../test-data/image/avatar900x900.png"); /// Map of context IDs to names for [`TestContext`]s. -static CONTEXT_NAMES: Lazy>> = - Lazy::new(|| std::sync::RwLock::new(BTreeMap::new())); +static CONTEXT_NAMES: LazyLock>> = + LazyLock::new(|| std::sync::RwLock::new(BTreeMap::new())); /// Manage multiple [`TestContext`]s in one place. ///