chaste_types/dependency.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
// SPDX-FileCopyrightText: 2024 The Chaste Authors
// SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
use crate::name::{PackageName, PackageNameBorrowed};
use crate::package::PackageID;
use crate::svs::SourceVersionSpecifier;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
#[non_exhaustive]
pub enum DependencyKind {
Dependency,
DevDependency,
PeerDependency,
OptionalDependency,
OptionalPeerDependency,
}
impl DependencyKind {
pub fn is_prod(self) -> bool {
matches!(self, DependencyKind::DevDependency)
}
pub fn is_dev(self) -> bool {
matches!(self, DependencyKind::DevDependency)
}
pub fn is_optional(self) -> bool {
matches!(
self,
DependencyKind::OptionalDependency | DependencyKind::OptionalPeerDependency
)
}
}
#[derive(Debug, Clone)]
pub struct Dependency {
pub kind: DependencyKind,
pub from: PackageID,
pub on: PackageID,
alias_name: Option<PackageName>,
svs: Option<SourceVersionSpecifier>,
}
impl Dependency {
pub fn svs(&self) -> Option<&SourceVersionSpecifier> {
self.svs.as_ref()
}
/// If the dependency is from npm, aliasing a package with a different name,
/// this represents the name under which it's aliased, e.g. if package.json defines
/// the dependency as `"lodash": "npm:@chastelock/lodash-fork@^4.0.0"`,
/// [`crate::Package::name`] will be `@chastelock/lodash-fork`, but [`crate::Dependency::alias_name`]
/// will be `lodash`. (If dependency is not from npm, the behavior is undefined.)
///
/// ```
/// # use chaste_types::{ChastefileBuilder, DependencyBuilder, DependencyKind, PackageBuilder, PackageName};
/// # let mut chastefile_builder = ChastefileBuilder::new();
/// # let root_pid = chastefile_builder.add_package(
/// # PackageBuilder::new(None, None).build().unwrap(),
/// # ).unwrap();
/// # chastefile_builder.set_root_package_id(root_pid);
/// # let lodash_pid = chastefile_builder.add_package(
/// # PackageBuilder::new(
/// # Some(PackageName::new("@chastelock/lodash-fork".to_string()).unwrap()),
/// # Some("4.0.0".to_string()),
/// # ).build().unwrap(),
/// # ).unwrap();
/// # let mut dependency_builder = DependencyBuilder::new(DependencyKind::Dependency, root_pid, lodash_pid);
/// # dependency_builder.alias_name(PackageName::new("lodash".to_string()).unwrap());
/// # chastefile_builder.add_dependency(dependency_builder.build());
/// # let chastefile = chastefile_builder.build().unwrap();
/// let dependencies = chastefile.package_dependencies(root_pid);
/// let dependency = dependencies.first().unwrap();
/// assert_eq!(chastefile.package(dependency.on).name().unwrap(), "@chastelock/lodash-fork");
/// assert_eq!(dependency.alias_name().unwrap(), "lodash");
/// ```
pub fn alias_name(&self) -> Option<PackageNameBorrowed> {
self.alias_name.as_ref().map(|a| a.as_borrowed())
}
}
pub struct DependencyBuilder {
kind: DependencyKind,
of: PackageID,
on: PackageID,
alias_name: Option<PackageName>,
svs: Option<SourceVersionSpecifier>,
}
impl DependencyBuilder {
pub fn new(kind: DependencyKind, of: PackageID, on: PackageID) -> DependencyBuilder {
DependencyBuilder {
kind,
of,
on,
alias_name: None,
svs: None,
}
}
pub fn alias_name(&mut self, alias_name: PackageName) {
self.alias_name = Some(alias_name);
}
pub fn svs(&mut self, svs: SourceVersionSpecifier) {
self.svs = Some(svs);
}
pub fn build(self) -> Dependency {
Dependency {
kind: self.kind,
from: self.of,
on: self.on,
alias_name: self.alias_name,
svs: self.svs,
}
}
}