use super::DscParseError;
use crate::control::{Priority, def_serde_traits_for};
use std::str::FromStr;
#[derive(Clone, Debug, PartialEq)]
pub struct PackageList {
pub name: String,
pub binary_type: String,
pub section: String,
pub priority: Priority,
}
def_serde_traits_for!(PackageList);
impl std::fmt::Display for PackageList {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
write!(
f,
"{} {} {} {}",
self.name, self.binary_type, self.section, self.priority
)
}
}
impl FromStr for PackageList {
type Err = DscParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let [name, binary_type, section, priority] = s
.split(" ")
.take(4)
.map(|v| v.to_owned())
.collect::<Vec<_>>()
.try_into()
.map_err(|_| DscParseError::Malformed)?;
Ok(Self {
name,
binary_type,
section,
priority: priority.parse().map_err(DscParseError::InvalidPriority)?,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! check_parses {
($name:ident, $checksum:expr ) => {
#[test]
fn $name() {
assert!($checksum.parse::<PackageList>().is_ok());
}
};
}
check_parses!(check_short, "ocaml-doc deb non-free/doc optional");
check_parses!(
check_with_arch,
"ocaml-doc deb non-free/doc optional arch=all"
);
}