use std::fs;
use std::io::{Error, ErrorKind};
#[cfg(unix)]
use std::os::unix::fs::MetadataExt;
use std::path::{Path, PathBuf};
#[derive(Debug, PartialEq, Eq)]
pub enum DebArchitecture {
All,
Alpha,
Armel,
Armhf,
Arm64,
Hppa,
I386,
Amd64,
Ia64,
M68k,
Mips,
Mipsel,
Mips64el,
PowerPC,
Ppc64,
Ppc64el,
Riscv64,
S390x,
Sh4,
Sparc4,
X32,
HurdI386,
KFreebsdI386,
KFreebsdAmd64,
}
impl DebArchitecture {
pub fn as_str(&self) -> &str {
match self {
DebArchitecture::All => "all",
DebArchitecture::Alpha => "Alpha",
DebArchitecture::Armel => "Armel",
DebArchitecture::Armhf => "armhf",
DebArchitecture::Arm64 => "arm64",
DebArchitecture::Hppa => "hppa",
DebArchitecture::I386 => "i386",
DebArchitecture::Amd64 => "amd64",
DebArchitecture::Ia64 => "ia64",
DebArchitecture::M68k => "m68k",
DebArchitecture::Mips => "mips",
DebArchitecture::Mipsel => "mipsel",
DebArchitecture::Mips64el => "mips64el",
DebArchitecture::PowerPC => "PowerPC",
DebArchitecture::Ppc64 => "PPC64",
DebArchitecture::Ppc64el => "ppc64el",
DebArchitecture::Riscv64 => "riscv64",
DebArchitecture::S390x => "s390x",
DebArchitecture::Sh4 => "SH4",
DebArchitecture::Sparc4 => "sparc4",
DebArchitecture::X32 => "x32",
DebArchitecture::HurdI386 => "hurd-i386",
DebArchitecture::KFreebsdI386 => "kfreebsd-i386",
DebArchitecture::KFreebsdAmd64 => "kfreebsd-amd64",
}
}
pub fn from(input: &str) -> std::io::Result<Self> {
match input {
"all" => Ok(DebArchitecture::All),
"Alpha" => Ok(DebArchitecture::Alpha),
"Armel" => Ok(DebArchitecture::Armel),
"armhf" => Ok(DebArchitecture::Armhf),
"arm64" => Ok(DebArchitecture::Arm64),
"hppa" => Ok(DebArchitecture::Hppa),
"i386" => Ok(DebArchitecture::I386),
"amd64" => Ok(DebArchitecture::Amd64),
"ia64" => Ok(DebArchitecture::Ia64),
"m68k" => Ok(DebArchitecture::M68k),
"mips" => Ok(DebArchitecture::Mips),
"mipsel" => Ok(DebArchitecture::Mipsel),
"mips64el" => Ok(DebArchitecture::Mips64el),
"PowerPC" => Ok(DebArchitecture::PowerPC),
"PPC64" => Ok(DebArchitecture::Ppc64),
"ppc64el" => Ok(DebArchitecture::Ppc64el),
"riscv64" => Ok(DebArchitecture::Riscv64),
"s390x" => Ok(DebArchitecture::S390x),
"SH4" => Ok(DebArchitecture::Sh4),
"sparc4" => Ok(DebArchitecture::Sparc4),
"x32" => Ok(DebArchitecture::X32),
"hurd-i386" => Ok(DebArchitecture::HurdI386),
"kfreebsd-i386" => Ok(DebArchitecture::KFreebsdI386),
"kfreebsd-amd64" => Ok(DebArchitecture::KFreebsdAmd64),
&_ => Err(Error::new(ErrorKind::Other, "invalid architecture name")),
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum DebPriority {
Required,
Important,
Standard,
Optional,
Extra,
}
impl DebPriority {
pub fn as_str(&self) -> &str {
match self {
DebPriority::Required => "required",
DebPriority::Important => "important",
DebPriority::Standard => "standard",
DebPriority::Optional => "optional",
DebPriority::Extra => "extra",
}
}
pub fn from(input: &str) -> std::io::Result<Self> {
match input {
"required" => Ok(DebPriority::Required),
"important" => Ok(DebPriority::Important),
"standard" => Ok(DebPriority::Standard),
"optional" => Ok(DebPriority::Optional),
"extra" => Ok(DebPriority::Extra),
&_ => Err(Error::new(ErrorKind::Other, "invalid priority name")),
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum DebCompression {
Xz,
Zstd,
}
#[derive(Debug)]
pub struct DebFile {
contents: Vec<u8>, mode: u32, path: PathBuf, }
impl DebFile {
#[cfg(unix)]
pub fn from_path<F, T>(from: F, to: T) -> std::io::Result<Self>
where
F: AsRef<Path>,
T: AsRef<std::ffi::OsStr>,
{
Ok(Self {
contents: fs::read(&from)?,
mode: fs::File::open(&from)?.metadata()?.mode(),
path: PathBuf::from(&to),
})
}
#[cfg(windows)]
pub fn from_path<F, T>(from: F, to: T) -> std::io::Result<Self>
where
F: AsRef<Path>,
T: AsRef<std::ffi::OsStr>,
{
Ok(Self {
contents: fs::read(&from)?,
mode: 33188,
path: PathBuf::from(&to),
})
}
pub fn from_buf<T>(buf: Vec<u8>, to: T) -> Self
where
T: AsRef<std::ffi::OsStr>,
{
Self {
contents: buf,
mode: 33188,
path: PathBuf::from(&to),
}
}
pub fn is_exec(mut self) -> Self {
self.mode = 33261;
self
}
pub fn is_conf(mut self) -> Self {
self.mode = 33188;
self
}
pub fn set_contents(mut self, contents: Vec<u8>) -> Self {
self.contents = contents;
self
}
pub fn set_mode(mut self, mode: u32) -> Self {
self.mode = mode;
self
}
pub fn set_path<T: AsRef<std::ffi::OsStr>>(mut self, to: T) -> Self {
self.path = PathBuf::from(&to);
self
}
pub fn contents(&self) -> &Vec<u8> {
&self.contents
}
pub fn mode(&self) -> &u32 {
&self.mode
}
pub fn path(&self) -> &PathBuf {
&self.path
}
}