use regex::Regex;
use serde::{Deserialize, Serialize};
use crate::project::Project;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Target {
name: String,
}
impl Target {
pub fn new<S>(name: S) -> Target
where
S: Into<String>,
{
Target { name: name.into() }
}
pub fn name(&self) -> &str {
&self.name
}
pub fn is_enabled_by(&self, enable_in_targets: &Option<Vec<String>>) -> bool {
if let Some(ref enable_in) = *enable_in_targets {
enable_in.contains(&self.name().to_owned())
} else {
self.name() != "test"
}
}
pub fn compose_project_name(&self, project: &Project) -> String {
let base_name: String = if self.name == "test" {
format!("{}test", project.name())
} else {
project.name().to_owned()
};
lazy_static! {
static ref NON_ALNUM: Regex = Regex::new(r#"[^a-z0-9]"#).unwrap();
}
NON_ALNUM
.replace_all(&base_name.to_lowercase(), "")
.into_owned()
}
}
impl<'de> Deserialize<'de> for Target {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let name = String::deserialize(deserializer)?;
Ok(Self { name })
}
}
impl Serialize for Target {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.name.serialize(serializer)
}
}