#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ChecksumType {
Md5,
Sha1,
Sha224,
Sha256,
Sha384,
Sha512,
#[default]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CompressionType {
Gzip,
Bzip2,
Xz,
Zstd,
#[default]
None,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct Dependency {
pub name: String,
pub epoch: Option<i32>,
pub version: Option<String>,
pub release: Option<String>,
pub flags: String,
pub pre: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct ChangelogEntry {
pub author: String,
pub date: i64,
pub content: String,
}
impl From<crate::rpm::DependencyInfo> for Dependency {
fn from(d: crate::rpm::DependencyInfo) -> Self {
Dependency {
name: d.name,
epoch: d.epoch,
version: d.version,
release: d.release,
flags: d.flags,
pre: d.pre,
}
}
}
impl From<crate::rpm::ChangelogInfo> for ChangelogEntry {
fn from(c: crate::rpm::ChangelogInfo) -> Self {
ChangelogEntry {
author: c.author,
date: c.date,
content: c.content,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct PackageFile {
pub path: String,
pub file_type: String,
pub digest: Option<String>,
pub size: i64,
}
#[derive(Debug, Clone, Default)]
pub struct Package {
pub pkgid: String,
pub name: String,
pub arch: String,
pub version: String,
pub epoch: Option<i32>,
pub release: String,
pub filename: String,
pub location: String,
pub checksum_type: ChecksumType,
pub checksum: String,
pub source_pkg: Option<String>,
pub size_archive: i64,
pub size_installed: i64,
pub size_package: i64,
pub time_file: i64,
pub time_build: i64,
pub summary: Option<String>,
pub description: Option<String>,
pub packager: Option<String>,
pub url: Option<String>,
pub license: Option<String>,
pub vendor: Option<String>,
pub group: Option<String>,
pub buildhost: Option<String>,
pub sourcerpm: Option<String>,
pub requires: Vec<Dependency>,
pub provides: Vec<Dependency>,
pub conflicts: Vec<Dependency>,
pub obsoletes: Vec<Dependency>,
pub suggests: Vec<Dependency>,
pub enhances: Vec<Dependency>,
pub recommends: Vec<Dependency>,
pub supplements: Vec<Dependency>,
pub files: Vec<PackageFile>,
pub changelogs: Vec<ChangelogEntry>,
pub location_href: Option<String>,
pub header_start: Option<i64>,
pub header_end: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct RepomdRecord {
pub record_type: String,
pub location: String,
pub checksum: Option<String>,
pub timestamp: Option<i64>,
pub size: Option<i64>,
pub open_size: Option<i64>,
pub open_checksum: Option<String>,
#[doc(hidden)]
pub checksum_type: Option<String>,
}
#[derive(Debug, Clone)]
pub struct DistroTag {
pub tag: String,
pub cpeid: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ContentTag {
pub tag: String,
}
#[derive(Debug, Clone)]
pub struct RepoTag {
pub tag: String,
}
#[derive(Debug, Clone, Default)]
pub struct Repomd {
pub revision: Option<String>,
pub records: Vec<RepomdRecord>,
pub distro_tags: Vec<DistroTag>,
pub content_tags: Vec<ContentTag>,
pub repo_tags: Vec<RepoTag>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_checksum_type_default() {
assert_eq!(ChecksumType::default(), ChecksumType::Unknown);
}
#[test]
fn test_compression_type_default() {
assert_eq!(CompressionType::default(), CompressionType::None);
}
#[test]
fn test_dependency_default() {
let dep = Dependency::default();
assert!(dep.name.is_empty());
assert!(dep.epoch.is_none());
assert!(dep.version.is_none());
assert!(dep.release.is_none());
assert!(dep.flags.is_empty());
assert!(!dep.pre);
}
#[test]
fn test_package_default() {
let pkg = Package::default();
assert!(pkg.pkgid.is_empty());
assert!(pkg.name.is_empty());
assert!(pkg.requires.is_empty());
assert!(pkg.provides.is_empty());
assert!(pkg.files.is_empty());
assert!(pkg.changelogs.is_empty());
}
#[test]
fn test_repomd_record_default() {
let record = RepomdRecord::default();
assert!(record.record_type.is_empty());
assert!(record.location.is_empty());
assert!(record.checksum.is_none());
}
#[test]
fn test_repomd_default() {
let repomd = Repomd::default();
assert!(repomd.revision.is_none());
assert!(repomd.records.is_empty());
}
#[test]
fn test_dependency_equality() {
let dep1 = Dependency {
name: "bash".to_string(),
epoch: Some(0),
version: Some("4.0".to_string()),
release: Some("1".to_string()),
flags: "EQ".to_string(),
pre: false,
};
let dep2 = Dependency {
name: "bash".to_string(),
epoch: Some(0),
version: Some("4.0".to_string()),
release: Some("1".to_string()),
flags: "EQ".to_string(),
pre: false,
};
assert_eq!(dep1, dep2);
}
#[test]
fn test_package_clone() {
let pkg = Package {
pkgid: "abc123".to_string(),
name: "test".to_string(),
arch: "x86_64".to_string(),
version: "1.0".to_string(),
epoch: Some(0),
release: "1".to_string(),
filename: "test-1.0-1.x86_64.rpm".to_string(),
location: String::new(),
checksum_type: ChecksumType::Sha256,
checksum: "def456".to_string(),
source_pkg: None,
size_archive: 1024,
size_installed: 2048,
size_package: 4096,
time_file: 1234567890,
time_build: 1234567800,
summary: Some("Test package".to_string()),
description: Some("A test package".to_string()),
packager: Some("Test Packager".to_string()),
url: Some("https://example.com".to_string()),
license: Some("MIT".to_string()),
vendor: Some("Test".to_string()),
group: Some("Development/Tools".to_string()),
buildhost: Some("build.example.com".to_string()),
sourcerpm: Some("test-1.0-1.src.rpm".to_string()),
requires: vec![Dependency::default()],
provides: vec![],
conflicts: vec![],
obsoletes: vec![],
suggests: vec![],
enhances: vec![],
recommends: vec![],
supplements: vec![],
files: vec![PackageFile::default()],
changelogs: vec![ChangelogEntry::default()],
location_href: None,
header_start: Some(100),
header_end: Some(200),
};
let cloned = pkg;
assert_eq!(cloned.pkgid, "abc123");
assert_eq!(cloned.name, "test");
assert_eq!(cloned.requires.len(), 1);
assert_eq!(cloned.files.len(), 1);
}
}