Skip to main content

chaste_types/
package.rs

1// SPDX-FileCopyrightText: 2024 The Chaste Authors
2// SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3
4use 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);