blob: 51e13c4e22909d6606568ed5cc3b0e51bec83d02 [file] [log] [blame]
use bstr::BString;
use crate::snapshot::util::{EncodedString, EncodedStringRef};
#[derive(Clone)]
pub(crate) struct NameEntry {
pub(crate) new_name: Option<BString>,
pub(crate) new_email: Option<BString>,
pub(crate) old_name: EncodedString,
}
#[derive(Clone)]
pub(crate) struct EmailEntry {
pub(crate) new_name: Option<BString>,
pub(crate) new_email: Option<BString>,
pub(crate) old_email: EncodedString,
pub(crate) entries_by_old_name: Vec<NameEntry>,
}
impl EmailEntry {
pub fn merge(
&mut self,
crate::Entry {
new_name,
new_email,
old_name,
old_email: _,
}: crate::Entry<'_>,
) {
let new_email = new_email.map(ToOwned::to_owned);
let new_name = new_name.map(ToOwned::to_owned);
match old_name {
None => {
self.new_email = new_email;
self.new_name = new_name;
}
Some(old_name) => {
let old_name: EncodedStringRef<'_> = old_name.into();
match self
.entries_by_old_name
.binary_search_by(|e| e.old_name.cmp_ref(old_name))
{
Ok(pos) => {
let entry = &mut self.entries_by_old_name[pos];
entry.new_name = new_name;
entry.new_email = new_email;
}
Err(insert_pos) => self.entries_by_old_name.insert(
insert_pos,
NameEntry {
new_name,
new_email,
old_name: old_name.into(),
},
),
}
}
}
}
}
impl<'a> From<crate::Entry<'a>> for EmailEntry {
fn from(
crate::Entry {
new_name,
new_email,
old_name,
old_email,
}: crate::Entry<'a>,
) -> Self {
let mut new_name = new_name.map(ToOwned::to_owned);
let mut new_email = new_email.map(ToOwned::to_owned);
let entries_by_old_name = old_name
.map(|name| {
vec![NameEntry {
new_name: new_name.take(),
new_email: new_email.take(),
old_name: name.into(),
}]
})
.unwrap_or_default();
EmailEntry {
new_name,
new_email,
old_email: old_email.into(),
entries_by_old_name,
}
}
}