use s2_common::types::{
self,
basin::{BasinName, BasinNamePrefix, BasinNameStartAfter},
};
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use super::config::{BasinConfig, BasinReconfiguration};
#[rustfmt::skip]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::IntoParams))]
#[cfg_attr(feature = "utoipa", into_params(parameter_in = Query))]
pub struct ListBasinsRequest {
#[cfg_attr(feature = "utoipa", param(value_type = String, default = "", required = false))]
pub prefix: Option<BasinNamePrefix>,
#[cfg_attr(feature = "utoipa", param(value_type = String, default = "", required = false))]
pub start_after: Option<BasinNameStartAfter>,
#[cfg_attr(feature = "utoipa", param(value_type = usize, maximum = 1000, default = 1000, required = false))]
pub limit: Option<usize>,
}
super::impl_list_request_conversions!(
ListBasinsRequest,
types::basin::BasinNamePrefix,
types::basin::BasinNameStartAfter
);
#[rustfmt::skip]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ListBasinsResponse {
#[cfg_attr(feature = "utoipa", schema(max_items = 1000))]
pub basins: Vec<BasinInfo>,
pub has_more: bool,
}
#[rustfmt::skip]
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct BasinInfo {
pub name: BasinName,
pub scope: Option<BasinScope>,
#[serde(with = "time::serde::rfc3339")]
pub created_at: OffsetDateTime,
#[serde(default, with = "time::serde::rfc3339::option")]
pub deleted_at: Option<OffsetDateTime>,
#[cfg_attr(feature = "utoipa", schema(ignore))]
pub state: BasinState,
}
impl From<types::basin::BasinInfo> for BasinInfo {
fn from(value: types::basin::BasinInfo) -> Self {
let types::basin::BasinInfo {
name,
scope,
created_at,
deleted_at,
} = value;
Self {
name,
scope: scope.map(Into::into),
created_at,
deleted_at,
state: basin_state_for_deleted_at(deleted_at.as_ref()),
}
}
}
fn basin_state_for_deleted_at(deleted_at: Option<&OffsetDateTime>) -> BasinState {
if deleted_at.is_some() {
BasinState::Deleting
} else {
BasinState::Active
}
}
#[derive(Deserialize)]
struct BasinInfoSerde {
name: BasinName,
scope: Option<BasinScope>,
#[serde(with = "time::serde::rfc3339")]
created_at: OffsetDateTime,
#[serde(default, with = "time::serde::rfc3339::option")]
deleted_at: Option<OffsetDateTime>,
}
impl<'de> Deserialize<'de> for BasinInfo {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let BasinInfoSerde {
name,
scope,
created_at,
deleted_at,
} = BasinInfoSerde::deserialize(deserializer)?;
let state = basin_state_for_deleted_at(deleted_at.as_ref());
Ok(Self {
name,
scope,
created_at,
deleted_at,
state,
})
}
}
#[rustfmt::skip]
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub enum BasinScope {
#[serde(rename = "aws:us-east-1")]
AwsUsEast1,
}
impl From<BasinScope> for types::basin::BasinScope {
fn from(value: BasinScope) -> Self {
match value {
BasinScope::AwsUsEast1 => Self::AwsUsEast1,
}
}
}
impl From<types::basin::BasinScope> for BasinScope {
fn from(value: types::basin::BasinScope) -> Self {
match value {
types::basin::BasinScope::AwsUsEast1 => Self::AwsUsEast1,
}
}
}
#[rustfmt::skip]
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[serde(rename_all = "kebab-case")]
pub enum BasinState {
Active,
Deleting,
}
#[rustfmt::skip]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct CreateOrReconfigureBasinRequest {
pub config: Option<BasinReconfiguration>,
pub scope: Option<BasinScope>,
}
#[rustfmt::skip]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct CreateBasinRequest {
pub basin: BasinName,
pub config: Option<BasinConfig>,
pub scope: Option<BasinScope>,
}