#![cfg_attr(
feature = "document-features",
cfg_attr(doc, doc = ::document_features::document_features!())
)]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
#![deny(missing_docs, rust_2018_idioms)]
#![forbid(unsafe_code)]
use bstr::BStr;
pub mod parse;
pub fn parse(buf: &[u8]) -> parse::Lines<'_> {
parse::Lines::new(buf)
}
pub fn parse_ignore_errors(buf: &[u8]) -> impl Iterator<Item = Entry<'_>> {
parse(buf).filter_map(Result::ok)
}
mod entry;
pub mod snapshot;
#[derive(Default, Clone)]
pub struct Snapshot {
entries_by_old_email: Vec<snapshot::EmailEntry>,
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Entry<'a> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub(crate) new_name: Option<&'a BStr>,
pub(crate) new_email: Option<&'a BStr>,
pub(crate) old_name: Option<&'a BStr>,
pub(crate) old_email: &'a BStr,
}