liftinstall/src/tasks/resolver.rs
2018-08-07 15:39:53 +10:00

100 lines
2.7 KiB
Rust

//! Resolves package names into a metadata + version object.
use std::env::consts::OS;
use installer::InstallerFramework;
use tasks::Task;
use tasks::TaskParamType;
use config::PackageDescription;
use regex::Regex;
use logging::LoggingErrors;
pub struct ResolvePackageTask {
pub name: String,
}
impl Task for ResolvePackageTask {
fn execute(
&mut self,
input: Vec<TaskParamType>,
context: &mut InstallerFramework,
messenger: &Fn(&str, f64),
) -> Result<TaskParamType, String> {
assert_eq!(input.len(), 0);
let mut metadata: Option<PackageDescription> = None;
for description in &context
.config
.as_ref()
.log_expect("Should have packages by now")
.packages
{
if self.name == description.name {
metadata = Some(description.clone());
break;
}
}
let package = match metadata {
Some(v) => v,
None => return Err(format!("Package {:?} could not be found.", self.name)),
};
messenger(
&format!(
"Polling {} for latest version of {:?}...",
package.source.name, package.name
),
0.0,
);
let results = package.source.get_current_releases()?;
messenger(
&format!("Resolving dependency for {:?}...", package.name),
0.5,
);
let filtered_regex = package.source.match_regex.replace("#PLATFORM#", OS);
let regex = match Regex::new(&filtered_regex) {
Ok(v) => v,
Err(v) => return Err(format!("An error occurred while compiling regex: {:?}", v)),
};
// Find the latest release in here
let latest_result = results
.into_iter()
.filter(|f| f.files.iter().filter(|x| regex.is_match(&x.name)).count() > 0)
.max_by_key(|f| f.version.clone());
let latest_result = match latest_result {
Some(v) => v,
None => return Err("No release with correct file found".to_string()),
};
let latest_version = latest_result.version.clone();
// Find the matching file in here
let latest_file = latest_result
.files
.into_iter()
.find(|x| regex.is_match(&x.name))
.log_expect("Searched file should have existed, but didn't");
info!("Selected file: {:?}", latest_file);
Ok(TaskParamType::File(latest_version, latest_file))
}
fn dependencies(&self) -> Vec<Box<Task>> {
vec![]
}
fn name(&self) -> String {
format!("ResolvePackageTask (for {:?})", self.name)
}
}