use {
crate::{dependency_type::DependencyType, group_selector::GroupSelector, packages::Packages, semver_range::SemverRange},
serde::Deserialize,
serde_json::Value,
std::collections::HashMap,
};
#[derive(Debug)]
pub struct SemverGroup {
pub selector: GroupSelector,
pub range: Option<SemverRange>,
}
impl SemverGroup {
pub fn get_exact_local_specifiers(all_dependency_types: &[DependencyType]) -> SemverGroup {
SemverGroup {
selector: GroupSelector::new(
&Packages::new(),
vec![],
vec!["local".to_string()],
"Local package versions must be exact".to_string(),
vec![],
vec![],
all_dependency_types,
),
range: None,
}
}
pub fn get_catch_all(all_dependency_types: &[DependencyType]) -> SemverGroup {
SemverGroup {
selector: GroupSelector::new(
&Packages::new(),
vec![],
vec![],
"Default Semver Group".to_string(),
vec![],
vec![],
all_dependency_types,
),
range: None,
}
}
pub fn from_config(group: &AnySemverGroup, packages: &Packages, all_dependency_types: &[DependencyType]) -> SemverGroup {
let selector = GroupSelector::new(
packages,
group.dependencies.clone(),
group.dependency_types.clone(),
group.label.clone(),
group.packages.clone(),
group.specifier_types.clone(),
all_dependency_types,
);
if let Some(true) = group.is_disabled {
SemverGroup { selector, range: None }
} else if let Some(true) = group.is_ignored {
SemverGroup { selector, range: None }
} else if let Some(range) = &group.range {
SemverGroup {
selector,
range: SemverRange::new(range),
}
} else {
panic!("Invalid semver group");
}
}
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AnySemverGroup {
#[serde(default)]
pub dependencies: Vec<String>,
#[serde(default)]
pub dependency_types: Vec<String>,
#[serde(default)]
pub label: String,
#[serde(default)]
pub packages: Vec<String>,
#[serde(default)]
pub specifier_types: Vec<String>,
pub is_disabled: Option<bool>,
pub is_ignored: Option<bool>,
pub range: Option<String>,
#[serde(flatten)]
pub unknown_fields: HashMap<String, Value>,
}