#![deny(missing_docs)]
#![allow(deprecated)]
pub mod lossy;
#[cfg(feature = "lossless")]
pub use lossless::control::{Binary, Control, Source};
pub mod fields;
pub use fields::*;
#[cfg(feature = "lossless")]
pub mod lossless;
#[cfg(feature = "lossless")]
pub use lossless::apt;
#[cfg(feature = "lossless")]
pub use lossless::changes;
#[cfg(feature = "lossless")]
pub use lossless::control;
#[cfg(feature = "lossless")]
pub mod pgp;
pub mod relations;
pub mod vcs;
use std::borrow::Cow;
#[derive(Debug, PartialEq)]
pub enum ParseIdentityError {
NoEmail,
}
impl std::fmt::Display for ParseIdentityError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
ParseIdentityError::NoEmail => write!(f, "No email found"),
}
}
}
impl std::error::Error for ParseIdentityError {}
pub fn parse_identity(s: &str) -> Result<(&str, &str), ParseIdentityError> {
if let Some((name, email)) = s.split_once('<') {
if let Some(email) = email.strip_suffix('>') {
Ok((name.trim(), email.trim()))
} else {
Err(ParseIdentityError::NoEmail)
}
} else if s.contains('@') {
Ok(("", s.trim()))
} else {
Err(ParseIdentityError::NoEmail)
}
}
pub trait VersionLookup {
fn lookup_version<'a>(
&'a self,
package: &'_ str,
) -> Option<std::borrow::Cow<'a, debversion::Version>>;
}
impl VersionLookup for std::collections::HashMap<String, debversion::Version> {
fn lookup_version<'a>(&'a self, package: &str) -> Option<Cow<'a, debversion::Version>> {
self.get(package).map(Cow::Borrowed)
}
}
impl<F> VersionLookup for F
where
F: Fn(&str) -> Option<debversion::Version>,
{
fn lookup_version<'a>(&'a self, name: &str) -> Option<Cow<'a, debversion::Version>> {
self(name).map(Cow::Owned)
}
}
impl VersionLookup for (String, debversion::Version) {
fn lookup_version<'a>(&'a self, name: &str) -> Option<Cow<'a, debversion::Version>> {
if name == self.0 {
Some(Cow::Borrowed(&self.1))
} else {
None
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_identity() {
assert_eq!(
parse_identity("Joe Example <joe@example.com>"),
Ok(("Joe Example", "joe@example.com"))
);
assert_eq!(
parse_identity("joe@example.com"),
Ok(("", "joe@example.com"))
);
assert_eq!(parse_identity("somebody"), Err(ParseIdentityError::NoEmail));
}
}