Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion i18n-embed-fl/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand All @@ -32,3 +32,7 @@ doc-comment = { workspace = true }
env_logger = { workspace = true }
pretty_assertions = { workspace = true }
rust-embed = { workspace = true }

[features]
# Uses dashmap implementation for `fl!()` macro lookups.
dashmap = ["dep:dashmap"]
61 changes: 57 additions & 4 deletions i18n-embed-fl/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ use std::{
path::Path,
sync::OnceLock,
};

#[cfg(feature = "dashmap")]
use dashmap::mapref::one::Ref;
#[cfg(not(feature = "dashmap"))]
use std::sync::{Arc, RwLock};

use syn::{parse::Parse, parse_macro_input, spanned::Spanned};
use unic_langid::LanguageIdentifier;

Expand Down Expand Up @@ -165,10 +171,57 @@ struct DomainSpecificData {
_assets: FileSystemAssets,
}

fn domains() -> &'static dashmap::DashMap<String, DomainSpecificData> {
static DOMAINS: OnceLock<dashmap::DashMap<String, DomainSpecificData>> = OnceLock::new();
#[derive(Default)]
struct DomainsMap {
#[cfg(not(feature = "dashmap"))]
map: RwLock<HashMap<String, Arc<DomainSpecificData>>>,

#[cfg(feature = "dashmap")]
map: dashmap::DashMap<String, DomainSpecificData>,
}

#[cfg(feature = "dashmap")]
impl DomainsMap {
fn get(&self, domain: &String) -> Option<Ref<String, DomainSpecificData>> {
self.map.get(domain)
}

fn entry_or_insert(
&self,
domain: &String,
data: DomainSpecificData,
) -> Ref<String, DomainSpecificData> {
self.map.entry(domain.clone()).or_insert(data).downgrade()
}
}

#[cfg(not(feature = "dashmap"))]
impl DomainsMap {
fn get(&self, domain: &String) -> Option<Arc<DomainSpecificData>> {
match self.map.read().unwrap().get(domain) {
None => None,
Some(data) => Some(data.clone()),
}
}

fn entry_or_insert(
&self,
domain: &String,
data: DomainSpecificData,
) -> Arc<DomainSpecificData> {
self.map
.write()
.unwrap()
.entry(domain.clone())
.or_insert(Arc::new(data))
.clone()
}
}

fn domains() -> &'static DomainsMap {
static DOMAINS: OnceLock<DomainsMap> = 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`
Expand Down Expand Up @@ -421,7 +474,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 {
Expand Down
Loading