use indexmap::IndexMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::config::{ApplyLayer, ApplyValExt};
#[derive(Debug, Clone)]
pub struct PackageManagersConfig {
pub preferred: IndexMap<String, String>,
pub additional: IndexMap<String, String>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct PackageManagersLayer {
pub preferred: Option<IndexMap<String, String>>,
pub additional: Option<IndexMap<String, String>>,
}
impl Default for PackageManagersConfig {
fn default() -> Self {
PackageManagersConfig {
preferred: IndexMap::default(),
additional: IndexMap::default(),
}
}
}
impl ApplyLayer for PackageManagersConfig {
type Layer = PackageManagersLayer;
fn apply_layer(&mut self, layer: Self::Layer) {
let PackageManagersLayer {
preferred,
additional,
} = layer;
self.preferred.apply_val(preferred);
self.additional.apply_val(additional);
}
}
impl PackageManagersConfig {
pub fn has(&self, key: &str) -> bool {
self.preferred.contains_key(key) || self.additional.contains_key(key)
}
pub fn has_npm(&self) -> bool {
self.has("npm") || self.has("npx")
}
pub fn is_empty(&self) -> bool {
self.preferred.is_empty() && self.additional.is_empty()
}
}