Sebastian Thielmake fmt53acf254 years agoHistory
90 lines · 2.6 KB · Rust
RawDownload
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,        }    }}