1use s2_common::types::{
2 self,
3 basin::{BasinName, BasinNamePrefix, BasinNameStartAfter},
4};
5use serde::{Deserialize, Serialize};
6use time::OffsetDateTime;
7
8use super::config::{BasinConfig, BasinReconfiguration};
9
10#[rustfmt::skip]
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[cfg_attr(feature = "utoipa", derive(utoipa::IntoParams))]
13#[cfg_attr(feature = "utoipa", into_params(parameter_in = Query))]
14pub struct ListBasinsRequest {
15 #[cfg_attr(feature = "utoipa", param(value_type = String, default = "", required = false))]
17 pub prefix: Option<BasinNamePrefix>,
18 #[cfg_attr(feature = "utoipa", param(value_type = String, default = "", required = false))]
21 pub start_after: Option<BasinNameStartAfter>,
22 #[cfg_attr(feature = "utoipa", param(value_type = usize, maximum = 1000, default = 1000, required = false))]
24 pub limit: Option<usize>,
25}
26
27super::impl_list_request_conversions!(
28 ListBasinsRequest,
29 types::basin::BasinNamePrefix,
30 types::basin::BasinNameStartAfter
31);
32
33#[rustfmt::skip]
34#[derive(Debug, Clone, Serialize, Deserialize)]
35#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
36pub struct ListBasinsResponse {
37 #[cfg_attr(feature = "utoipa", schema(max_items = 1000))]
39 pub basins: Vec<BasinInfo>,
40 pub has_more: bool,
42}
43
44#[rustfmt::skip]
45#[derive(Debug, Clone, Serialize)]
46#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
47pub struct BasinInfo {
48 pub name: BasinName,
50 pub scope: Option<BasinScope>,
52 #[serde(with = "time::serde::rfc3339")]
54 pub created_at: OffsetDateTime,
55 #[serde(default, with = "time::serde::rfc3339::option")]
57 pub deleted_at: Option<OffsetDateTime>,
58 #[cfg_attr(feature = "utoipa", schema(ignore))]
60 pub state: BasinState,
61}
62
63impl From<types::basin::BasinInfo> for BasinInfo {
64 fn from(value: types::basin::BasinInfo) -> Self {
65 let types::basin::BasinInfo {
66 name,
67 scope,
68 created_at,
69 deleted_at,
70 } = value;
71
72 Self {
73 name,
74 scope: scope.map(Into::into),
75 created_at,
76 deleted_at,
77 state: basin_state_for_deleted_at(deleted_at.as_ref()),
78 }
79 }
80}
81
82fn basin_state_for_deleted_at(deleted_at: Option<&OffsetDateTime>) -> BasinState {
83 if deleted_at.is_some() {
84 BasinState::Deleting
85 } else {
86 BasinState::Active
87 }
88}
89
90#[derive(Deserialize)]
91struct BasinInfoSerde {
92 name: BasinName,
93 scope: Option<BasinScope>,
94 #[serde(with = "time::serde::rfc3339")]
95 created_at: OffsetDateTime,
96 #[serde(default, with = "time::serde::rfc3339::option")]
97 deleted_at: Option<OffsetDateTime>,
98}
99
100impl<'de> Deserialize<'de> for BasinInfo {
101 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
102 where
103 D: serde::Deserializer<'de>,
104 {
105 let BasinInfoSerde {
106 name,
107 scope,
108 created_at,
109 deleted_at,
110 } = BasinInfoSerde::deserialize(deserializer)?;
111 let state = basin_state_for_deleted_at(deleted_at.as_ref());
112
113 Ok(Self {
114 name,
115 scope,
116 created_at,
117 deleted_at,
118 state,
119 })
120 }
121}
122
123#[rustfmt::skip]
124#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
125#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
126pub enum BasinScope {
127 #[serde(rename = "aws:us-east-1")]
129 AwsUsEast1,
130}
131
132impl From<BasinScope> for types::basin::BasinScope {
133 fn from(value: BasinScope) -> Self {
134 match value {
135 BasinScope::AwsUsEast1 => Self::AwsUsEast1,
136 }
137 }
138}
139
140impl From<types::basin::BasinScope> for BasinScope {
141 fn from(value: types::basin::BasinScope) -> Self {
142 match value {
143 types::basin::BasinScope::AwsUsEast1 => Self::AwsUsEast1,
144 }
145 }
146}
147
148#[rustfmt::skip]
149#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
150#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
151#[serde(rename_all = "kebab-case")]
152pub enum BasinState {
153 Active,
155 Deleting,
157}
158
159#[rustfmt::skip]
160#[derive(Debug, Clone, Serialize, Deserialize)]
161#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
162pub struct CreateOrReconfigureBasinRequest {
163 pub config: Option<BasinReconfiguration>,
165 pub scope: Option<BasinScope>,
168}
169
170#[rustfmt::skip]
171#[derive(Debug, Clone, Serialize, Deserialize)]
172#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
173pub struct CreateBasinRequest {
174 pub basin: BasinName,
178 pub config: Option<BasinConfig>,
180 pub scope: Option<BasinScope>,
182}