#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FrozenMode {
Frozen,
Prefer,
No,
Fix,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FrozenOverride {
Frozen,
No,
Prefer,
}
impl FrozenOverride {
pub fn cli_flag(self) -> &'static str {
match self {
Self::Frozen => "--frozen-lockfile",
Self::No => "--no-frozen-lockfile",
Self::Prefer => "--prefer-frozen-lockfile",
}
}
pub fn cli_flag_bag_entry(self) -> (&'static str, &'static str) {
match self {
Self::Frozen => ("frozen-lockfile", "true"),
Self::No => ("frozen-lockfile", "false"),
Self::Prefer => ("prefer-frozen-lockfile", "true"),
}
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct GlobalVirtualStoreFlags {
pub enable: bool,
pub disable: bool,
}
impl GlobalVirtualStoreFlags {
pub fn to_cli_flag_bag(self) -> Vec<(String, String)> {
let mut out = Vec::new();
if self.enable {
out.push((
"enable-global-virtual-store".to_string(),
"true".to_string(),
));
}
if self.disable {
out.push((
"disable-global-virtual-store".to_string(),
"false".to_string(),
));
}
out
}
pub fn is_set(self) -> bool {
self.enable || self.disable
}
}
impl FrozenMode {
pub fn from_override(cli: Option<FrozenOverride>, yaml_prefer_frozen: Option<bool>) -> Self {
match cli {
Some(FrozenOverride::Frozen) => Self::Frozen,
Some(FrozenOverride::No) => Self::No,
Some(FrozenOverride::Prefer) => Self::Prefer,
None => match yaml_prefer_frozen {
Some(true) => Self::Prefer,
Some(false) => Self::No,
None => Self::default_for_env(),
},
}
}
fn default_for_env() -> Self {
if std::env::var_os("CI").is_some() {
Self::Frozen
} else {
Self::Prefer
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cli_frozen_beats_yaml() {
let m = FrozenMode::from_override(Some(FrozenOverride::Frozen), Some(false));
assert!(matches!(m, FrozenMode::Frozen));
}
#[test]
fn yaml_prefer_true_maps_to_prefer() {
let m = FrozenMode::from_override(None, Some(true));
assert!(matches!(m, FrozenMode::Prefer));
}
#[test]
fn yaml_prefer_false_maps_to_no() {
let m = FrozenMode::from_override(None, Some(false));
assert!(matches!(m, FrozenMode::No));
}
}