use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
pub const BUILTIN_PROVIDERS: &[&str] = &[
"npm",
"yarn",
"pnpm",
"bun", "go", "pip", "poetry", "uv", "bundler", "composer", "git-submodule", ];
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct PrepareProviderConfig {
#[serde(default)]
pub auto: bool,
pub run: Option<String>,
#[serde(default)]
pub sources: Vec<String>,
#[serde(default)]
pub outputs: Vec<String>,
#[serde(default)]
pub env: BTreeMap<String, String>,
pub dir: Option<String>,
pub description: Option<String>,
#[serde(default)]
pub depends: Vec<String>,
pub timeout: Option<String>,
}
impl PrepareProviderConfig {
pub fn is_custom(&self, name: &str) -> bool {
!BUILTIN_PROVIDERS.contains(&name) && self.run.is_some()
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct PrepareConfig {
#[serde(default)]
pub disable: Vec<String>,
#[serde(flatten)]
pub providers: BTreeMap<String, PrepareProviderConfig>,
}
impl PrepareConfig {
pub fn merge(&self, other: &PrepareConfig) -> PrepareConfig {
let mut providers = self.providers.clone();
for (k, v) in &other.providers {
providers.insert(k.clone(), v.clone());
}
let mut disable = self.disable.clone();
disable.extend(other.disable.clone());
PrepareConfig { disable, providers }
}
pub fn get(&self, name: &str) -> Option<&PrepareProviderConfig> {
self.providers.get(name)
}
}