use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct ProvisionResourceRequest {
pub r#type: ResourceType,
pub config: Value,
}
#[derive(Deserialize)]
#[serde(untagged)] pub enum ResourceInput {
Shuttle(ProvisionResourceRequest),
Custom(Value),
}
#[derive(
Debug, Clone, PartialEq, Eq, strum::Display, strum::EnumString, Serialize, Deserialize,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub enum ResourceState {
Authorizing,
Provisioning,
Failed,
Ready,
Deleting,
Deleted,
#[cfg(feature = "unknown-variants")]
#[doc(hidden)]
#[typeshare(skip)]
#[serde(untagged, skip_serializing)]
#[strum(default, to_string = "Unknown: {0}")]
Unknown(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct ResourceResponse {
pub r#type: ResourceType,
pub state: ResourceState,
pub config: Value,
pub output: Value,
}
#[derive(Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct ResourceListResponse {
pub resources: Vec<ResourceResponse>,
}
#[derive(
Clone,
Debug,
Deserialize,
Serialize,
Eq,
PartialEq,
strum::AsRefStr,
strum::Display,
strum::EnumString,
)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub enum ResourceType {
#[strum(to_string = "database::shared::postgres")]
#[serde(rename = "database::shared::postgres")]
DatabaseSharedPostgres,
#[strum(to_string = "database::aws_rds::postgres")]
#[serde(rename = "database::aws_rds::postgres")]
DatabaseAwsRdsPostgres,
#[strum(to_string = "database::aws_rds::mysql")]
#[serde(rename = "database::aws_rds::mysql")]
DatabaseAwsRdsMySql,
#[strum(to_string = "database::aws_rds::mariadb")]
#[serde(rename = "database::aws_rds::mariadb")]
DatabaseAwsRdsMariaDB,
#[strum(to_string = "secrets")]
#[serde(rename = "secrets")]
Secrets,
#[strum(to_string = "container")]
#[serde(rename = "container")]
Container,
#[cfg(feature = "unknown-variants")]
#[doc(hidden)]
#[typeshare(skip)]
#[serde(untagged, skip_serializing)]
#[strum(default, to_string = "Unknown: {0}")]
Unknown(String),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[typeshare::typeshare]
pub struct SetEnvVarsRequest {
pub vars: HashMap<String, String>,
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use super::*;
#[test]
fn to_string_and_back() {
let inputs = [
ResourceType::DatabaseSharedPostgres,
ResourceType::Secrets,
ResourceType::Container,
];
for input in inputs {
let actual = ResourceType::from_str(input.as_ref()).unwrap();
assert_eq!(input, actual, ":{} should map back to itself", input);
}
}
}