use regex::Regex;
use serde::{Deserialize, Serialize};
use std::{error::Error, fmt};
use crate::end_of_life;
#[derive(Debug)]
pub struct RegexCaptureError;
impl Error for RegexCaptureError {}
impl fmt::Display for RegexCaptureError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Could not capture version from input")
}
}
#[derive(Serialize, Deserialize)]
pub struct Application {
#[serde(with = "serde_regex")]
pub version_regex: Regex,
pub version_command: String,
pub eol: Option<end_of_life::EolConfig>,
}
impl Application {
pub fn query_version(&self, input: &str) -> Result<String, Box<dyn Error>> {
let results = self.version_regex.captures(input).and_then(|cap| {
cap.name("version")
.map(|version| String::from(version.as_str()))
});
match results {
Some(x) => Ok(x),
_ => Err(Box::new(RegexCaptureError)),
}
}
}
impl Default for Application {
fn default() -> Self {
Self {
version_regex: Regex::new(r"test: (?P<version>[0-9.]+)").unwrap(),
version_command: String::from(""),
eol: None,
}
}
}
#[derive(Serialize, Debug)]
pub struct Status {
pub name: String,
pub version: String,
pub eol_status: Option<String>,
}