pub mod github;
pub mod simple;
use super::*;
use github::*;
use simple::*;
#[derive(Debug, Clone)]
pub struct AppHostConfig {
pub display: bool,
pub display_name: String,
}
#[derive(Debug, Clone)]
pub struct WorkspaceHostConfig {
pub force_latest: bool,
pub order: Vec<HostingStyle>,
pub github: Option<GithubHostConfig>,
pub simple: Option<SimpleHostConfig>,
}
#[derive(Debug, Clone)]
pub struct HostConfigInheritable {
pub common: CommonHostConfig,
pub force_latest: Option<bool>,
pub display: Option<bool>,
pub display_name: Option<String>,
pub order: Option<Vec<HostingStyle>>,
pub github: Option<GithubHostLayer>,
pub simple: Option<SimpleHostLayer>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct HostLayer {
#[serde(flatten)]
pub common: CommonHostLayer,
#[serde(skip_serializing_if = "Option::is_none")]
pub force_latest: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
pub order: Option<Vec<HostingStyle>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub github: Option<BoolOr<GithubHostLayer>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub simple: Option<BoolOr<SimpleHostLayer>>,
}
impl HostConfigInheritable {
pub fn defaults_for_package(workspaces: &WorkspaceGraph, pkg_idx: PackageIdx) -> Self {
Self {
common: CommonHostConfig::defaults_for_package(workspaces, pkg_idx),
github: None,
simple: None,
order: None,
force_latest: None,
display: None,
display_name: None,
}
}
pub fn defaults_for_workspace(workspaces: &WorkspaceGraph) -> Self {
Self {
common: CommonHostConfig::defaults_for_workspace(workspaces),
github: None,
simple: None,
order: None,
force_latest: None,
display: None,
display_name: None,
}
}
pub fn apply_inheritance_for_package(
self,
workspaces: &WorkspaceGraph,
pkg_idx: PackageIdx,
) -> AppHostConfig {
let Self {
common: _,
github: _,
simple: _,
order: _,
force_latest: _,
display,
display_name,
} = self;
let package = workspaces.package(pkg_idx);
AppHostConfig {
display: display.unwrap_or(true),
display_name: display_name.unwrap_or_else(|| package.name.clone()),
}
}
pub fn apply_inheritance_for_workspace(
self,
workspaces: &WorkspaceGraph,
) -> WorkspaceHostConfig {
let Self {
common,
github,
simple,
order,
force_latest,
display: _,
display_name: _,
} = self;
let github = github.map(|github| {
let mut default = GithubHostConfig::defaults_for_workspace(workspaces, &common);
default.apply_layer(github);
default
});
let simple = simple.map(|simple| {
let mut default = SimpleHostConfig::defaults_for_workspace(workspaces, &common);
default.apply_layer(simple);
default
});
WorkspaceHostConfig {
github,
simple,
order: order.unwrap_or_default(),
force_latest: force_latest.unwrap_or(false),
}
}
}
impl ApplyLayer for HostConfigInheritable {
type Layer = HostLayer;
fn apply_layer(
&mut self,
Self::Layer {
common,
order,
github,
simple,
force_latest,
display,
display_name,
}: Self::Layer,
) {
self.common.apply_layer(common);
self.github.apply_bool_layer(github);
self.simple.apply_bool_layer(simple);
self.order.apply_opt(order);
self.force_latest.apply_opt(force_latest);
self.display.apply_opt(display);
self.display_name.apply_opt(display_name);
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct CommonHostLayer {}
#[derive(Debug, Default, Clone)]
pub struct CommonHostConfig {}
impl CommonHostConfig {
pub fn defaults_for_package(_workspaces: &WorkspaceGraph, _pkg_idx: PackageIdx) -> Self {
Self {}
}
pub fn defaults_for_workspace(_workspaces: &WorkspaceGraph) -> Self {
Self {}
}
}
impl ApplyLayer for CommonHostConfig {
type Layer = CommonHostLayer;
fn apply_layer(&mut self, Self::Layer {}: Self::Layer) {}
}
impl ApplyLayer for CommonHostLayer {
type Layer = CommonHostLayer;
fn apply_layer(&mut self, Self::Layer {}: Self::Layer) {}
}