use crate::{
config::release_type::ReleaseType,
forge::request::FileChange,
result::Result,
updater::{
generic::updater::GenericUpdater, go::updater::GoUpdater,
java::updater::JavaUpdater, manager::UpdaterPackage,
node::updater::NodeUpdater, php::updater::PhpUpdater,
python::updater::PythonUpdater, ruby::updater::RubyUpdater,
rust::updater::RustUpdater, traits::PackageUpdater,
},
};
pub enum Updater {
Generic(GenericUpdater),
Go(GoUpdater),
Java(JavaUpdater),
Node(NodeUpdater),
Php(PhpUpdater),
Python(PythonUpdater),
Ruby(RubyUpdater),
Rust(RustUpdater),
}
impl Updater {
pub fn new(release_type: ReleaseType) -> Self {
match release_type {
ReleaseType::Generic => Updater::Generic(GenericUpdater::default()),
ReleaseType::Go => Updater::Go(GoUpdater::new()),
ReleaseType::Java => Updater::Java(JavaUpdater::new()),
ReleaseType::Node => Updater::Node(NodeUpdater::new()),
ReleaseType::Php => Updater::Php(PhpUpdater::new()),
ReleaseType::Python => Updater::Python(PythonUpdater::new()),
ReleaseType::Ruby => Updater::Ruby(RubyUpdater::new()),
ReleaseType::Rust => Updater::Rust(RustUpdater::new()),
}
}
pub fn update(
&self,
package: &UpdaterPackage,
workspace_packages: &[UpdaterPackage],
) -> Result<Option<Vec<FileChange>>> {
match self {
Updater::Generic(updater) => {
updater.update(package, workspace_packages)
}
Updater::Go(updater) => updater.update(package, workspace_packages),
Updater::Java(updater) => {
updater.update(package, workspace_packages)
}
Updater::Node(updater) => {
updater.update(package, workspace_packages)
}
Updater::Php(updater) => {
updater.update(package, workspace_packages)
}
Updater::Python(updater) => {
updater.update(package, workspace_packages)
}
Updater::Ruby(updater) => {
updater.update(package, workspace_packages)
}
Updater::Rust(updater) => {
updater.update(package, workspace_packages)
}
}
}
}
impl std::fmt::Debug for Updater {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Updater::Generic(_) => write!(f, "Updater::Generic"),
Updater::Go(_) => write!(f, "Updater::Go"),
Updater::Java(_) => write!(f, "Updater::Java"),
Updater::Node(_) => write!(f, "Updater::Node"),
Updater::Php(_) => write!(f, "Updater::Php"),
Updater::Python(_) => write!(f, "Updater::Python"),
Updater::Ruby(_) => write!(f, "Updater::Ruby"),
Updater::Rust(_) => write!(f, "Updater::Rust"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn creates_updater_for_each_release_type() {
let types = vec![
ReleaseType::Generic,
ReleaseType::Java,
ReleaseType::Node,
ReleaseType::Php,
ReleaseType::Python,
ReleaseType::Ruby,
ReleaseType::Rust,
];
for release_type in types {
let updater = Updater::new(release_type);
assert!(matches!(
updater,
Updater::Generic(_)
| Updater::Java(_)
| Updater::Node(_)
| Updater::Php(_)
| Updater::Python(_)
| Updater::Ruby(_)
| Updater::Rust(_)
));
}
}
}