use std::collections::BTreeMap;
use std::sync::Arc;
use parking_lot::RwLock;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use fakecloud_core::multi_account::{AccountState, MultiAccountState};
pub const APPCONFIG_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
pub type TagMap = BTreeMap<String, String>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HostedVersionRecord {
pub version_number: i64,
pub description: Option<String>,
pub content: Vec<u8>,
pub content_type: String,
pub version_label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProfileRecord {
pub id: String,
pub application_id: String,
pub name: String,
pub description: Option<String>,
pub location_uri: String,
pub retrieval_role_arn: Option<String>,
pub validators: Value,
pub profile_type: String,
pub kms_key_arn: Option<String>,
pub kms_key_identifier: Option<String>,
#[serde(default)]
pub hosted_versions: BTreeMap<i64, HostedVersionRecord>,
#[serde(default)]
pub next_version_number: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeploymentRecord {
pub deployment_number: i64,
pub deployment: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvironmentRecord {
pub id: String,
pub application_id: String,
pub name: String,
pub description: Option<String>,
pub state: String,
pub monitors: Value,
#[serde(default)]
pub deployments: BTreeMap<i64, DeploymentRecord>,
#[serde(default)]
pub next_deployment_number: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplicationRecord {
pub id: String,
pub name: String,
pub description: Option<String>,
#[serde(default)]
pub environments: BTreeMap<String, EnvironmentRecord>,
#[serde(default)]
pub profiles: BTreeMap<String, ProfileRecord>,
#[serde(default)]
pub experiments: BTreeMap<String, ExperimentRecord>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExperimentRecord {
pub id: String,
pub definition: Value,
#[serde(default)]
pub runs: BTreeMap<i64, Value>,
#[serde(default)]
pub next_run_number: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionRecord {
pub token: String,
pub application_id: String,
pub environment_id: String,
pub configuration_profile_id: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AppConfigState {
#[serde(default)]
pub applications: BTreeMap<String, ApplicationRecord>,
#[serde(default)]
pub deployment_strategies: BTreeMap<String, Value>,
#[serde(default)]
pub extensions: BTreeMap<String, Value>,
#[serde(default)]
pub extension_associations: BTreeMap<String, Value>,
#[serde(default)]
pub referenced_extensions: BTreeMap<String, Value>,
#[serde(default)]
pub account_settings: Option<Value>,
#[serde(default)]
pub sessions: BTreeMap<String, SessionRecord>,
#[serde(default)]
pub tags: BTreeMap<String, TagMap>,
}
impl AccountState for AppConfigState {
fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
Self::default()
}
}
pub type SharedAppConfigState = Arc<RwLock<MultiAccountState<AppConfigState>>>;
#[derive(Debug, Serialize, Deserialize)]
pub struct AppConfigSnapshot {
pub schema_version: u32,
pub accounts: MultiAccountState<AppConfigState>,
}
pub fn application_arn(region: &str, account_id: &str, id: &str) -> String {
format!("arn:aws:appconfig:{region}:{account_id}:application/{id}")
}
pub fn environment_arn(region: &str, account_id: &str, app: &str, env: &str) -> String {
format!("arn:aws:appconfig:{region}:{account_id}:application/{app}/environment/{env}")
}
pub fn profile_arn(region: &str, account_id: &str, app: &str, profile: &str) -> String {
format!(
"arn:aws:appconfig:{region}:{account_id}:application/{app}/configurationprofile/{profile}"
)
}
pub fn deployment_strategy_arn(region: &str, account_id: &str, id: &str) -> String {
format!("arn:aws:appconfig:{region}:{account_id}:deploymentstrategy/{id}")
}
pub fn extension_arn(region: &str, account_id: &str, id: &str, version: i64) -> String {
format!("arn:aws:appconfig:{region}:{account_id}:extension/{id}/{version}")
}
pub fn extension_association_arn(region: &str, account_id: &str, id: &str) -> String {
format!("arn:aws:appconfig:{region}:{account_id}:extensionassociation/{id}")
}