From 7598f94c9c06b7b0c6311d08efb2db51106b274b Mon Sep 17 00:00:00 2001 From: Alexandre Leblanc Date: Sat, 25 Jan 2025 19:17:50 +0900 Subject: [PATCH 1/3] update #131: Make dashmap optional. You can activate the dashmap implementation by activating the feature flag `performance` in your `Cargo.toml` file. This will cause an additional usage of dashmap. Alternatively, you may compile directly with ``` cargo build --features performance ``` --- i18n-embed-fl/Cargo.toml | 6 ++++- i18n-embed-fl/src/lib.rs | 49 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/i18n-embed-fl/Cargo.toml b/i18n-embed-fl/Cargo.toml index 85445ab..1e4153c 100644 --- a/i18n-embed-fl/Cargo.toml +++ b/i18n-embed-fl/Cargo.toml @@ -11,7 +11,7 @@ license = "MIT" proc-macro = true [dependencies] -dashmap = "6.0" +dashmap = { version = "6.0", optional = true } find-crate = { workspace = true } fluent = { workspace = true } fluent-syntax = { workspace = true } @@ -32,3 +32,7 @@ doc-comment = { workspace = true } env_logger = { workspace = true } pretty_assertions = { workspace = true } rust-embed = { workspace = true } + +[features] +# Enables more performant version of the crate. May download extra dependencies. +performance = ["dep:dashmap"] \ No newline at end of file diff --git a/i18n-embed-fl/src/lib.rs b/i18n-embed-fl/src/lib.rs index e68c915..e699f82 100644 --- a/i18n-embed-fl/src/lib.rs +++ b/i18n-embed-fl/src/lib.rs @@ -9,6 +9,13 @@ use std::{ path::Path, sync::OnceLock, }; + +#[cfg(not(feature = "performance"))] +use std::sync::{Arc, RwLock}; + +#[cfg(feature = "performance")] +use dashmap::{DashMap, Entry, mapref::one::Ref}; + use syn::{parse::Parse, parse_macro_input, spanned::Spanned}; use unic_langid::LanguageIdentifier; @@ -165,10 +172,44 @@ struct DomainSpecificData { _assets: FileSystemAssets, } -fn domains() -> &'static dashmap::DashMap { - static DOMAINS: OnceLock> = OnceLock::new(); +#[derive(Default)] +struct DomainsMap { + #[cfg(not(feature = "performance"))] + map: RwLock>>, + + #[cfg(feature = "performance")] + map: dashmap::DashMap +} + +impl DomainsMap { + #[cfg(not(feature = "performance"))] + fn get(&self, domain: &String) -> Option> { + match self.map.read().unwrap().get(domain) { + None => { None} + Some(data) => { Some(data.clone()) } + } + } + + #[cfg(not(feature = "performance"))] + fn entry_or_insert(&self, domain: &String, data: DomainSpecificData) -> Arc { + self.map.write().unwrap().entry(domain.clone()).or_insert(Arc::new(data)).clone() + } + + #[cfg(feature = "performance")] + fn get(&self, domain: &String) -> Option> { + self.map.get(domain) + } + + #[cfg(feature = "performance")] + fn entry_or_insert(&self, domain: &String, data: DomainSpecificData) -> Ref { + self.map.entry(domain.clone()).or_insert(data).downgrade() + } +} + +fn domains() -> &'static DomainsMap { + static DOMAINS: OnceLock = OnceLock::new(); - DOMAINS.get_or_init(|| dashmap::DashMap::new()) + DOMAINS.get_or_init(|| DomainsMap::default()) } /// A macro to obtain localized messages and optionally their attributes, and check the `message_id`, `attribute_id` @@ -421,7 +462,7 @@ pub fn fl(input: TokenStream) -> TokenStream { _assets: assets, }; - domains().entry(domain.clone()).or_insert(data).downgrade() + domains().entry_or_insert(&domain, data) }; let message_id_string = match &message_id { From 7b065dbd981162168ce21375f7ee165e4e71e934 Mon Sep 17 00:00:00 2001 From: Alexandre Leblanc Date: Sat, 25 Jan 2025 19:22:16 +0900 Subject: [PATCH 2/3] update #131: Run rustfmt --- i18n-embed-fl/src/lib.rs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/i18n-embed-fl/src/lib.rs b/i18n-embed-fl/src/lib.rs index e699f82..b590b9c 100644 --- a/i18n-embed-fl/src/lib.rs +++ b/i18n-embed-fl/src/lib.rs @@ -14,7 +14,7 @@ use std::{ use std::sync::{Arc, RwLock}; #[cfg(feature = "performance")] -use dashmap::{DashMap, Entry, mapref::one::Ref}; +use dashmap::{mapref::one::Ref, DashMap, Entry}; use syn::{parse::Parse, parse_macro_input, spanned::Spanned}; use unic_langid::LanguageIdentifier; @@ -178,21 +178,30 @@ struct DomainsMap { map: RwLock>>, #[cfg(feature = "performance")] - map: dashmap::DashMap + map: dashmap::DashMap, } impl DomainsMap { #[cfg(not(feature = "performance"))] fn get(&self, domain: &String) -> Option> { match self.map.read().unwrap().get(domain) { - None => { None} - Some(data) => { Some(data.clone()) } + None => None, + Some(data) => Some(data.clone()), } } #[cfg(not(feature = "performance"))] - fn entry_or_insert(&self, domain: &String, data: DomainSpecificData) -> Arc { - self.map.write().unwrap().entry(domain.clone()).or_insert(Arc::new(data)).clone() + fn entry_or_insert( + &self, + domain: &String, + data: DomainSpecificData, + ) -> Arc { + self.map + .write() + .unwrap() + .entry(domain.clone()) + .or_insert(Arc::new(data)) + .clone() } #[cfg(feature = "performance")] @@ -201,7 +210,11 @@ impl DomainsMap { } #[cfg(feature = "performance")] - fn entry_or_insert(&self, domain: &String, data: DomainSpecificData) -> Ref { + fn entry_or_insert( + &self, + domain: &String, + data: DomainSpecificData, + ) -> Ref { self.map.entry(domain.clone()).or_insert(data).downgrade() } } From 0d2bab3807d24a0f1235572fe77031ca29c66d0c Mon Sep 17 00:00:00 2001 From: Alexandre Leblanc Date: Mon, 27 Jan 2025 15:12:18 +0900 Subject: [PATCH 3/3] update #131: Rename feature to `dashmap` and change implementation. --- i18n-embed-fl/Cargo.toml | 4 ++-- i18n-embed-fl/src/lib.rs | 43 ++++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/i18n-embed-fl/Cargo.toml b/i18n-embed-fl/Cargo.toml index 1e4153c..e54b2b3 100644 --- a/i18n-embed-fl/Cargo.toml +++ b/i18n-embed-fl/Cargo.toml @@ -34,5 +34,5 @@ pretty_assertions = { workspace = true } rust-embed = { workspace = true } [features] -# Enables more performant version of the crate. May download extra dependencies. -performance = ["dep:dashmap"] \ No newline at end of file +# Uses dashmap implementation for `fl!()` macro lookups. +dashmap = ["dep:dashmap"] \ No newline at end of file diff --git a/i18n-embed-fl/src/lib.rs b/i18n-embed-fl/src/lib.rs index b590b9c..86b8139 100644 --- a/i18n-embed-fl/src/lib.rs +++ b/i18n-embed-fl/src/lib.rs @@ -10,12 +10,11 @@ use std::{ sync::OnceLock, }; -#[cfg(not(feature = "performance"))] +#[cfg(feature = "dashmap")] +use dashmap::mapref::one::Ref; +#[cfg(not(feature = "dashmap"))] use std::sync::{Arc, RwLock}; -#[cfg(feature = "performance")] -use dashmap::{mapref::one::Ref, DashMap, Entry}; - use syn::{parse::Parse, parse_macro_input, spanned::Spanned}; use unic_langid::LanguageIdentifier; @@ -174,15 +173,30 @@ struct DomainSpecificData { #[derive(Default)] struct DomainsMap { - #[cfg(not(feature = "performance"))] + #[cfg(not(feature = "dashmap"))] map: RwLock>>, - #[cfg(feature = "performance")] + #[cfg(feature = "dashmap")] map: dashmap::DashMap, } +#[cfg(feature = "dashmap")] +impl DomainsMap { + fn get(&self, domain: &String) -> Option> { + self.map.get(domain) + } + + fn entry_or_insert( + &self, + domain: &String, + data: DomainSpecificData, + ) -> Ref { + self.map.entry(domain.clone()).or_insert(data).downgrade() + } +} + +#[cfg(not(feature = "dashmap"))] impl DomainsMap { - #[cfg(not(feature = "performance"))] fn get(&self, domain: &String) -> Option> { match self.map.read().unwrap().get(domain) { None => None, @@ -190,7 +204,6 @@ impl DomainsMap { } } - #[cfg(not(feature = "performance"))] fn entry_or_insert( &self, domain: &String, @@ -203,20 +216,6 @@ impl DomainsMap { .or_insert(Arc::new(data)) .clone() } - - #[cfg(feature = "performance")] - fn get(&self, domain: &String) -> Option> { - self.map.get(domain) - } - - #[cfg(feature = "performance")] - fn entry_or_insert( - &self, - domain: &String, - data: DomainSpecificData, - ) -> Ref { - self.map.entry(domain.clone()).or_insert(data).downgrade() - } } fn domains() -> &'static DomainsMap {