eds contact resolver: cache when no contact found
This commit is contained in:
@@ -47,8 +47,8 @@ pub type AnyContactID = String;
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ContactResolver<T: ContactResolverBackend> {
|
pub struct ContactResolver<T: ContactResolverBackend> {
|
||||||
backend: T,
|
backend: T,
|
||||||
display_name_cache: HashMap<AnyContactID, String>,
|
display_name_cache: HashMap<AnyContactID, Option<String>>,
|
||||||
contact_id_cache: HashMap<String, AnyContactID>,
|
contact_id_cache: HashMap<String, Option<AnyContactID>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ContactResolverBackend> ContactResolver<T>
|
impl<T: ContactResolverBackend> ContactResolver<T>
|
||||||
@@ -67,29 +67,25 @@ where
|
|||||||
|
|
||||||
pub fn resolve_contact_id(&mut self, address: &str) -> Option<AnyContactID> {
|
pub fn resolve_contact_id(&mut self, address: &str) -> Option<AnyContactID> {
|
||||||
if let Some(id) = self.contact_id_cache.get(address) {
|
if let Some(id) = self.contact_id_cache.get(address) {
|
||||||
return Some(id.clone());
|
return id.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
let id = self.backend.resolve_contact_id(address).map(|id| id.into());
|
let id = self.backend.resolve_contact_id(address).map(|id| id.into());
|
||||||
if let Some(ref id) = id {
|
|
||||||
self.contact_id_cache
|
self.contact_id_cache
|
||||||
.insert(address.to_string(), id.clone());
|
.insert(address.to_string(), id.clone());
|
||||||
}
|
|
||||||
|
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_contact_display_name(&mut self, contact_id: &AnyContactID) -> Option<String> {
|
pub fn get_contact_display_name(&mut self, contact_id: &AnyContactID) -> Option<String> {
|
||||||
if let Some(display_name) = self.display_name_cache.get(contact_id) {
|
if let Some(display_name) = self.display_name_cache.get(contact_id) {
|
||||||
return Some(display_name.clone());
|
return display_name.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
let backend_contact_id: T::ContactID = T::ContactID::from((*contact_id).clone());
|
let backend_contact_id: T::ContactID = T::ContactID::from((*contact_id).clone());
|
||||||
let display_name = self.backend.get_contact_display_name(&backend_contact_id);
|
let display_name = self.backend.get_contact_display_name(&backend_contact_id);
|
||||||
if let Some(ref display_name) = display_name {
|
|
||||||
self.display_name_cache
|
self.display_name_cache
|
||||||
.insert(contact_id.to_string(), display_name.clone());
|
.insert(contact_id.to_string(), display_name.clone());
|
||||||
}
|
|
||||||
|
|
||||||
display_name
|
display_name
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user