Add arch field to Package

This commit is contained in:
Nathan Fisher 2023-04-04 20:45:43 -04:00
parent 90b163eb1b
commit a58150cc9c
2 changed files with 61 additions and 2 deletions

56
src/package/arch.rs Normal file
View File

@ -0,0 +1,56 @@
use serde::{Deserialize, Serialize};
use std::{fmt, str::FromStr, error::Error};
#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Serialize)]
#[allow(non_camel_case_types)]
pub enum Arch {
armv7l,
aarch64,
i486,
i586,
i686,
riscv64,
#[default]
x86_64,
}
impl fmt::Display for Arch {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", match self {
Self::armv7l => "armv7l",
Self::aarch64 => "aarch64",
Self::i486 => "i486",
Self::i586 => "i586",
Self::i686 => "i686",
Self::riscv64 => "riscv64",
Self::x86_64 => "x86_64",
})
}
}
#[derive(Debug)]
pub struct ParseArchError;
impl fmt::Display for ParseArchError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "error parsing architecture")
}
}
impl Error for ParseArchError {}
impl FromStr for Arch {
type Err = ParseArchError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"i486" | "x86" => Ok(Self::i486),
"i586" => Ok(Self::i586),
"i686" => Ok(Self::i686),
"armv7l" | "arm" => Ok(Self::armv7l),
"arm64" | "aarch64" | "armv8" => Ok(Self::aarch64),
"riscv" | "riscv64" => Ok(Self::riscv64),
_ => Err(ParseArchError)
}
}
}

View File

@ -1,3 +1,4 @@
mod arch;
mod dependency; mod dependency;
mod specs; mod specs;
@ -15,7 +16,7 @@ use {
crate::tar::{Node, Owner}, crate::tar::{Node, Owner},
}; };
pub use {dependency::Dependency, specs::Specs}; pub use {arch::Arch, dependency::Dependency, specs::Specs};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub struct User { pub struct User {
@ -36,6 +37,8 @@ pub struct Package {
pub name: String, pub name: String,
/// The `Version` of the package /// The `Version` of the package
pub version: Version, pub version: Version,
/// The architecture the package is built for
pub arch: Arch,
/// The release number for this package /// The release number for this package
pub release: u8, pub release: u8,
/// a single line description of the package /// a single line description of the package
@ -110,7 +113,7 @@ impl Package {
/// Returns the formatted full package name including version and release strings /// Returns the formatted full package name including version and release strings
pub fn fullname(&self) -> String { pub fn fullname(&self) -> String {
format!("{}-{}_{}", self.name, self.version, self.release) format!("{}-{}_{}{}", self.name, self.version, self.arch, self.release)
} }
/// Tests whether this package is an update for another /// Tests whether this package is an update for another