use crate::patterns::merge_plugin_partials;
use crate::shapes::OneOrMany;
use crate::toolchains_config::ToolchainPluginConfig;
use crate::{config_enum, config_struct};
use moon_common::{Id, IdExt};
use rustc_hash::FxHashMap;
use schematic::Config;
use version_spec::UnresolvedVersionSpec;
config_enum!(
#[derive(Config)]
#[serde(untagged)]
pub enum ProjectToolchainEntry {
Disabled, Enabled(bool),
#[setting(nested)]
Object(ToolchainPluginConfig),
}
);
impl ProjectToolchainEntry {
pub fn is_enabled(&self) -> bool {
match self {
Self::Disabled => false,
Self::Enabled(state) => *state,
Self::Object(_) => true,
}
}
pub fn get_version(&self) -> Option<&UnresolvedVersionSpec> {
match self {
Self::Object(config) => config.version.as_ref(),
_ => None,
}
}
}
config_struct!(
#[derive(Config)]
#[config(allow_unknown_fields)]
pub struct ProjectToolchainsConfig {
#[setting(alias = "defaults")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default: Option<OneOrMany<Id>>,
#[setting(flatten, nested, merge = merge_plugin_partials)]
pub plugins: FxHashMap<Id, ProjectToolchainEntry>,
}
);
impl ProjectToolchainsConfig {
pub fn get_plugin_config(&self, id: impl AsRef<str>) -> Option<&ProjectToolchainEntry> {
let (stable_id, unstable_id) = Id::stable_and_unstable(id);
self.plugins
.get(&stable_id)
.or_else(|| self.plugins.get(&unstable_id))
}
}
config_struct!(
#[derive(Config)]
pub struct ProjectWorkspaceInheritedTasksConfig {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub exclude: Vec<Id>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include: Option<Vec<Id>>,
#[serde(default, skip_serializing_if = "FxHashMap::is_empty")]
pub rename: FxHashMap<Id, Id>,
}
);
config_struct!(
#[derive(Config)]
pub struct ProjectWorkspaceConfig {
#[setting(nested)]
pub inherited_tasks: ProjectWorkspaceInheritedTasksConfig,
}
);