use indexmap::{IndexMap, IndexSet};
use serde::{Deserialize, Serialize};
use typeshare::typeshare;
use crate::entities::swarm::_PartialSwarmConfig;
use super::{
ResourceTarget, ResourceTargetVariant,
action::_PartialActionConfig,
alerter::_PartialAlerterConfig,
build::_PartialBuildConfig,
builder::_PartialBuilderConfig,
deployment::_PartialDeploymentConfig,
permission::{
PermissionLevel, PermissionLevelAndSpecifics, SpecificPermission,
},
procedure::_PartialProcedureConfig,
repo::_PartialRepoConfig,
server::_PartialServerConfig,
stack::_PartialStackConfig,
sync::_PartialResourceSyncConfig,
variable::Variable,
};
#[typeshare]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ResourcesToml {
#[serde(
default,
alias = "swarm",
skip_serializing_if = "Vec::is_empty"
)]
pub swarms: Vec<ResourceToml<_PartialSwarmConfig>>,
#[serde(
default,
alias = "server",
skip_serializing_if = "Vec::is_empty"
)]
pub servers: Vec<ResourceToml<_PartialServerConfig>>,
#[serde(
default,
alias = "deployment",
skip_serializing_if = "Vec::is_empty"
)]
pub deployments: Vec<ResourceToml<_PartialDeploymentConfig>>,
#[serde(
default,
alias = "stack",
skip_serializing_if = "Vec::is_empty"
)]
pub stacks: Vec<ResourceToml<_PartialStackConfig>>,
#[serde(
default,
alias = "build",
skip_serializing_if = "Vec::is_empty"
)]
pub builds: Vec<ResourceToml<_PartialBuildConfig>>,
#[serde(
default,
alias = "repo",
skip_serializing_if = "Vec::is_empty"
)]
pub repos: Vec<ResourceToml<_PartialRepoConfig>>,
#[serde(
default,
alias = "procedure",
skip_serializing_if = "Vec::is_empty"
)]
pub procedures: Vec<ResourceToml<_PartialProcedureConfig>>,
#[serde(
default,
alias = "action",
skip_serializing_if = "Vec::is_empty"
)]
pub actions: Vec<ResourceToml<_PartialActionConfig>>,
#[serde(
default,
alias = "alerter",
skip_serializing_if = "Vec::is_empty"
)]
pub alerters: Vec<ResourceToml<_PartialAlerterConfig>>,
#[serde(
default,
alias = "builder",
skip_serializing_if = "Vec::is_empty"
)]
pub builders: Vec<ResourceToml<_PartialBuilderConfig>>,
#[serde(
default,
alias = "resource_sync",
skip_serializing_if = "Vec::is_empty"
)]
pub resource_syncs: Vec<ResourceToml<_PartialResourceSyncConfig>>,
#[serde(
default,
alias = "user_group",
skip_serializing_if = "Vec::is_empty"
)]
pub user_groups: Vec<UserGroupToml>,
#[serde(
default,
alias = "variable",
skip_serializing_if = "Vec::is_empty"
)]
pub variables: Vec<Variable>,
}
#[typeshare]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ResourceToml<PartialConfig: Default> {
pub name: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub description: String,
#[serde(default, skip_serializing_if = "is_false")]
pub template: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(default, skip_serializing_if = "is_false")]
pub deploy: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub after: Vec<String>,
#[serde(default)]
pub config: PartialConfig,
}
fn is_false(b: &bool) -> bool {
!b
}
#[typeshare]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct UserGroupToml {
pub name: String,
#[serde(default)]
pub everyone: bool,
#[serde(default)]
pub users: Vec<String>,
#[serde(default)]
#[cfg_attr(feature = "utoipa", schema(value_type = HashMap<ResourceTargetVariant, PermissionLevelAndSpecifics>))]
pub all:
IndexMap<ResourceTargetVariant, PermissionLevelAndSpecifics>,
#[serde(default, alias = "permission")]
pub permissions: Vec<PermissionToml>,
}
#[typeshare]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct PermissionToml {
pub target: ResourceTarget,
#[serde(default)]
pub level: PermissionLevel,
#[serde(default, skip_serializing_if = "IndexSet::is_empty")]
#[cfg_attr(feature = "utoipa", schema(value_type = Vec<SpecificPermission>))]
pub specific: IndexSet<SpecificPermission>,
}