1use s2_common::types::{
2 self,
3 basin::{BasinName, BasinNamePrefix, BasinNameStartAfter},
4};
5use serde::{Deserialize, Serialize};
6use time::OffsetDateTime;
7
8use super::config::BasinConfig;
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 #[serde(rename = "aws:us-west-2")]
132 AwsUsWest2,
133 #[serde(rename = "aws:eu-north-1")]
135 AwsEuNorth1,
136}
137
138impl From<BasinScope> for types::basin::BasinScope {
139 fn from(value: BasinScope) -> Self {
140 match value {
141 BasinScope::AwsUsEast1 => Self::AwsUsEast1,
142 BasinScope::AwsUsWest2 => Self::AwsUsWest2,
143 BasinScope::AwsEuNorth1 => Self::AwsEuNorth1,
144 }
145 }
146}
147
148impl From<types::basin::BasinScope> for BasinScope {
149 fn from(value: types::basin::BasinScope) -> Self {
150 match value {
151 types::basin::BasinScope::AwsUsEast1 => Self::AwsUsEast1,
152 types::basin::BasinScope::AwsUsWest2 => Self::AwsUsWest2,
153 types::basin::BasinScope::AwsEuNorth1 => Self::AwsEuNorth1,
154 }
155 }
156}
157
158#[rustfmt::skip]
159#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
160#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
161#[serde(rename_all = "kebab-case")]
162pub enum BasinState {
163 Active,
165 Deleting,
167}
168
169#[rustfmt::skip]
170#[derive(Debug, Clone, Serialize, Deserialize)]
171#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
172pub struct EnsureBasinRequest {
173 pub config: Option<BasinConfig>,
175 pub scope: Option<BasinScope>,
179}
180
181#[rustfmt::skip]
182#[derive(Debug, Clone, Serialize, Deserialize)]
183#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
184pub struct CreateBasinRequest {
185 pub basin: BasinName,
189 pub config: Option<BasinConfig>,
191 pub scope: Option<BasinScope>,
194}