1use std::cmp;
5
6pub use nodejs_semver::Version as PackageVersion;
7
8use crate::checksums::Checksums;
9use crate::derivation::{PackageDerivation, PackageDerivationMeta};
10use crate::error::Result;
11use crate::name::PackageName;
12use crate::source::{PackageSource, PackageSourceType};
13
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct Package {
16 name: Option<PackageName>,
17 version: Option<PackageVersion>,
18 checksums: Option<Checksums>,
19 source: Option<PackageSource>,
20 derived: Option<PackageDerivationMeta>,
21}
22
23impl Package {
24 pub fn name(&self) -> Option<&PackageName> {
25 self.name.as_ref()
26 }
27
28 pub fn version(&self) -> Option<&PackageVersion> {
29 self.version.as_ref()
30 }
31
32 pub fn checksums(&self) -> Option<&Checksums> {
33 self.checksums.as_ref()
34 }
35
36 pub fn source(&self) -> Option<&PackageSource> {
37 self.source.as_ref()
38 }
39
40 pub fn source_type(&self) -> Option<PackageSourceType> {
41 self.source.as_ref().map(|s| s.source_type())
42 }
43
44 pub fn derivation(&self) -> Option<&PackageDerivation> {
45 self.derived.as_ref().map(|d| d.derivation())
46 }
47
48 pub fn derivation_meta(&self) -> Option<&PackageDerivationMeta> {
49 self.derived.as_ref()
50 }
51
52 pub fn derived_from(&self) -> Option<PackageID> {
53 self.derived.as_ref().map(|d| d.derived_from())
54 }
55
56 pub fn is_derived(&self) -> bool {
57 self.derived.is_some()
58 }
59}
60
61impl PartialOrd for Package {
62 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
63 let o = self.name.cmp(&other.name);
64 if o != cmp::Ordering::Equal {
65 return Some(o);
66 }
67 let o = self.version.cmp(&other.version);
68 if o != cmp::Ordering::Equal {
69 return Some(o);
70 }
71 None
72 }
73}
74
75pub struct PackageBuilder {
76 name: Option<PackageName>,
77 version: Option<String>,
78 checksums: Option<Checksums>,
79 source: Option<PackageSource>,
80 derived: Option<PackageDerivationMeta>,
81}
82
83impl PackageBuilder {
84 pub fn new(name: Option<PackageName>, version: Option<String>) -> Self {
85 PackageBuilder {
86 name,
87 version,
88 checksums: None,
89 source: None,
90 derived: None,
91 }
92 }
93
94 pub fn get_name(&self) -> Option<&PackageName> {
95 self.name.as_ref()
96 }
97
98 pub fn name(&mut self, new_name: Option<PackageName>) {
99 self.name = new_name;
100 }
101
102 pub fn version(&mut self, new_version: Option<String>) {
103 self.version = new_version;
104 }
105
106 pub fn checksums(&mut self, new_checksums: Checksums) {
107 self.checksums = Some(new_checksums);
108 }
109
110 pub fn source(&mut self, new_source: PackageSource) {
111 self.source = Some(new_source);
112 }
113
114 pub fn derived(&mut self, new_derived: PackageDerivationMeta) {
115 self.derived = Some(new_derived);
116 }
117
118 pub fn build(self) -> Result<Package> {
119 Ok(Package {
120 name: self.name,
121 version: self.version.map(PackageVersion::parse).transpose()?,
122 checksums: self.checksums.filter(|c| !c.integrity().hashes.is_empty()),
123 source: self.source,
124 derived: self.derived,
125 })
126 }
127}
128
129#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
130pub struct PackageID(pub(crate) u64);