use crate::package::Package;
use serde::Deserialize;
use serde::Serialize;
use std::collections::BTreeMap;
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
#[serde(transparent)]
pub struct TargetMap(pub BTreeMap<String, String>);
impl TargetMap {
pub(crate) fn includes_package(&self, pkg: &Package) -> bool {
let valid_targets = if let Some(targets) = &pkg.only_for_targets {
targets
} else {
return true;
};
for (k, v) in &valid_targets.0 {
let target_value = if let Some(target_value) = self.0.get(k) {
target_value
} else {
return false;
};
if target_value != v {
return false;
};
}
true
}
}
impl std::fmt::Display for TargetMap {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
for (key, value) in &self.0 {
write!(f, "{}={} ", key, value)?;
}
Ok(())
}
}
#[derive(thiserror::Error, Debug)]
pub enum TargetParseError {
#[error("Cannot parse key-value pair out of '{0}'")]
MissingEquals(String),
}
impl std::str::FromStr for TargetMap {
type Err = TargetParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let kvs = s
.split_whitespace()
.map(|kv| {
kv.split_once('=')
.ok_or_else(|| TargetParseError::MissingEquals(kv.to_string()))
.map(|(k, v)| (k.to_string(), v.to_string()))
})
.collect::<Result<BTreeMap<String, String>, _>>()?;
Ok(TargetMap(kvs))
}
}