use super::DeployArgs;
use crate::commands::install;
#[derive(Debug, Clone, Copy, Default)]
pub(super) struct StripFields {
pub(super) dependencies: bool,
pub(super) dev_dependencies: bool,
pub(super) optional_dependencies: bool,
}
impl StripFields {
pub(super) fn for_args(args: &DeployArgs) -> Self {
let DepAxis {
prod,
dev,
optional,
} = DepAxis::for_args(args);
Self {
dependencies: !prod,
dev_dependencies: !dev,
optional_dependencies: !optional,
}
}
pub(super) fn for_bundled_sibling(args: &DeployArgs) -> Self {
Self {
dependencies: false,
dev_dependencies: true,
optional_dependencies: args.no_optional,
}
}
}
#[derive(Debug, Clone, Copy)]
struct DepAxis {
prod: bool,
dev: bool,
optional: bool,
}
impl DepAxis {
fn for_args(args: &DeployArgs) -> Self {
Self {
prod: !args.dev,
dev: args.dev || args.no_prod,
optional: !args.dev && !args.no_optional,
}
}
}
pub(super) fn dep_selection_for_args(args: &DeployArgs) -> install::DepSelection {
let prod = !args.dev && !args.no_prod;
let dev = args.dev;
install::DepSelection::from_flags(prod, dev, args.no_optional)
}
pub(super) fn keep_dep_for_args(
args: &DeployArgs,
) -> impl Fn(&aube_lockfile::DirectDep) -> bool + use<> {
let DepAxis {
prod,
dev,
optional,
} = DepAxis::for_args(args);
move |d: &aube_lockfile::DirectDep| match d.dep_type {
aube_lockfile::DepType::Production => prod,
aube_lockfile::DepType::Dev => dev,
aube_lockfile::DepType::Optional => optional,
}
}
#[cfg(test)]
mod tests {
use super::*;
fn deploy_args() -> DeployArgs {
DeployArgs {
target: std::path::PathBuf::from("/tmp/unused"),
dev: false,
no_optional: false,
prod: false,
no_prod: false,
offline: false,
prefer_offline: false,
lockfile: crate::cli_args::LockfileArgs::default(),
network: crate::cli_args::NetworkArgs::default(),
virtual_store: crate::cli_args::VirtualStoreArgs::default(),
}
}
#[test]
fn dep_selection_default_is_prod() {
let a = deploy_args();
assert_eq!(dep_selection_for_args(&a), install::DepSelection::Prod);
}
#[test]
fn dep_selection_no_prod_is_all() {
let a = DeployArgs {
no_prod: true,
..deploy_args()
};
assert_eq!(dep_selection_for_args(&a), install::DepSelection::All);
}
#[test]
fn dep_selection_no_prod_and_no_optional_is_no_optional() {
let a = DeployArgs {
no_prod: true,
no_optional: true,
..deploy_args()
};
assert_eq!(
dep_selection_for_args(&a),
install::DepSelection::NoOptional
);
}
#[test]
fn dep_selection_covers_every_flag_combo() {
let cases: &[(bool, bool, bool, install::DepSelection)] = &[
(false, false, false, install::DepSelection::Prod),
(false, false, true, install::DepSelection::ProdNoOptional),
(false, true, false, install::DepSelection::All),
(false, true, true, install::DepSelection::NoOptional),
(true, false, false, install::DepSelection::Dev),
(true, false, true, install::DepSelection::DevNoOptional),
];
for &(dev, no_prod, no_optional, want) in cases {
let a = DeployArgs {
dev,
no_prod,
no_optional,
..deploy_args()
};
assert_eq!(
dep_selection_for_args(&a),
want,
"dev={dev} no_prod={no_prod} no_optional={no_optional}"
);
}
}
#[test]
fn strip_default_drops_dev_keeps_prod_and_optional() {
let s = StripFields::for_args(&deploy_args());
assert!(!s.dependencies);
assert!(s.dev_dependencies);
assert!(!s.optional_dependencies);
}
#[test]
fn strip_no_prod_keeps_everything() {
let a = DeployArgs {
no_prod: true,
..deploy_args()
};
let s = StripFields::for_args(&a);
assert!(!s.dependencies);
assert!(!s.dev_dependencies);
assert!(!s.optional_dependencies);
}
#[test]
fn strip_dev_only_drops_prod_and_optional() {
let a = DeployArgs {
dev: true,
..deploy_args()
};
let s = StripFields::for_args(&a);
assert!(s.dependencies);
assert!(!s.dev_dependencies);
assert!(s.optional_dependencies);
}
#[test]
fn strip_for_bundled_sibling_always_drops_dev() {
let s = StripFields::for_bundled_sibling(&DeployArgs {
no_prod: true,
..deploy_args()
});
assert!(s.dev_dependencies);
assert!(!s.dependencies);
assert!(!s.optional_dependencies);
}
}