1pub mod dynamodb;
54pub mod ecs;
55pub mod iam;
56pub mod lambda;
57pub mod logs;
58pub mod s3;
59
60use vantage_table::any::AnyTable;
61#[cfg(feature = "vista")]
62use vantage_vista::Vista;
63
64use crate::AwsAccount;
65
66#[derive(Debug, Clone, Copy, PartialEq, Eq)]
70pub enum FactoryMode {
71 List,
72 Single,
73}
74
75#[derive(Debug, Clone)]
83pub struct Factory {
84 aws: AwsAccount,
85}
86
87impl Factory {
88 pub fn new(aws: AwsAccount) -> Self {
90 Self { aws }
91 }
92
93 pub fn known_names() -> &'static [&'static str] {
112 &[
113 "iam.user",
114 "iam.users",
115 "iam.group",
116 "iam.groups",
117 "iam.role",
118 "iam.roles",
119 "iam.policy",
120 "iam.policies",
121 "iam.instance_profile",
122 "iam.instance_profiles",
123 "log.group",
124 "log.groups",
125 "ecs.cluster",
126 "ecs.clusters",
127 "ecs.task_definition",
128 "ecs.task_definitions",
129 "s3.bucket",
130 "s3.buckets",
131 "lambda.function",
132 "lambda.functions",
133 "dynamodb.table",
134 "dynamodb.tables",
135 ]
136 }
137
138 pub fn for_name(&self, name: &str) -> Option<(AnyTable, FactoryMode)> {
140 let aws = self.aws.clone();
141 let (table, mode) = match name {
142 "iam.user" => (AnyTable::new(iam::users_table(aws)), FactoryMode::Single),
143 "iam.users" => (AnyTable::new(iam::users_table(aws)), FactoryMode::List),
144 "iam.group" => (AnyTable::new(iam::groups_table(aws)), FactoryMode::Single),
145 "iam.groups" => (AnyTable::new(iam::groups_table(aws)), FactoryMode::List),
146 "iam.role" => (AnyTable::new(iam::roles_table(aws)), FactoryMode::Single),
147 "iam.roles" => (AnyTable::new(iam::roles_table(aws)), FactoryMode::List),
148 "iam.policy" => (AnyTable::new(iam::policies_table(aws)), FactoryMode::Single),
149 "iam.policies" => (AnyTable::new(iam::policies_table(aws)), FactoryMode::List),
150 "iam.instance_profile" => (
155 AnyTable::new(iam::instance_profiles_table(aws)),
156 FactoryMode::Single,
157 ),
158 "iam.instance_profiles" => (
159 AnyTable::new(iam::instance_profiles_table(aws)),
160 FactoryMode::List,
161 ),
162 "log.group" => (AnyTable::new(logs::groups_table(aws)), FactoryMode::Single),
163 "log.groups" => (AnyTable::new(logs::groups_table(aws)), FactoryMode::List),
164 "ecs.cluster" => (AnyTable::new(ecs::clusters_table(aws)), FactoryMode::Single),
168 "ecs.clusters" => (AnyTable::new(ecs::clusters_table(aws)), FactoryMode::List),
169 "ecs.task_definition" => (
174 AnyTable::new(ecs::task_definitions_table(aws)),
175 FactoryMode::Single,
176 ),
177 "ecs.task_definitions" => (
178 AnyTable::new(ecs::task_definitions_table(aws)),
179 FactoryMode::List,
180 ),
181 "s3.bucket" => (AnyTable::new(s3::buckets_table(aws)), FactoryMode::Single),
182 "s3.buckets" => (AnyTable::new(s3::buckets_table(aws)), FactoryMode::List),
183 "lambda.function" => (
186 AnyTable::new(lambda::functions_table(aws)),
187 FactoryMode::Single,
188 ),
189 "lambda.functions" => (
190 AnyTable::new(lambda::functions_table(aws)),
191 FactoryMode::List,
192 ),
193 "dynamodb.table" => (
197 AnyTable::new(dynamodb::tables_table(aws)),
198 FactoryMode::Single,
199 ),
200 "dynamodb.tables" => (
201 AnyTable::new(dynamodb::tables_table(aws)),
202 FactoryMode::List,
203 ),
204 _ => return None,
205 };
206 Some((table, mode))
207 }
208
209 pub fn from_arn(&self, arn: &str) -> Option<AnyTable> {
213 let aws = self.aws.clone();
214 if let Some(t) = iam::user::User::from_arn(arn, aws.clone()) {
215 return Some(AnyTable::new(t));
216 }
217 if let Some(t) = iam::group::Group::from_arn(arn, aws.clone()) {
218 return Some(AnyTable::new(t));
219 }
220 if let Some(t) = iam::role::Role::from_arn(arn, aws.clone()) {
221 return Some(AnyTable::new(t));
222 }
223 if let Some(t) = iam::policy::Policy::from_arn(arn, aws.clone()) {
224 return Some(AnyTable::new(t));
225 }
226 if let Some(t) = iam::instance_profile::InstanceProfile::from_arn(arn, aws.clone()) {
227 return Some(AnyTable::new(t));
228 }
229 if let Some(t) = iam::access_key::AccessKey::from_arn(arn, aws.clone()) {
230 return Some(AnyTable::new(t));
231 }
232 if let Some(t) = logs::stream::LogStream::from_arn(arn, aws.clone()) {
233 return Some(AnyTable::new(t));
234 }
235 if let Some(t) = logs::group::LogGroup::from_arn(arn, aws.clone()) {
236 return Some(AnyTable::new(t));
237 }
238 if let Some(t) = ecs::cluster::Cluster::from_arn(arn, aws.clone()) {
239 return Some(AnyTable::new(t));
240 }
241 if let Some(t) = s3::object::Object::from_arn(arn, aws.clone()) {
244 return Some(AnyTable::new(t));
245 }
246 if let Some(t) = s3::bucket::Bucket::from_arn(arn, aws.clone()) {
247 return Some(AnyTable::new(t));
248 }
249 if let Some(t) = lambda::function::Function::from_arn(arn, aws.clone()) {
250 return Some(AnyTable::new(t));
251 }
252 if let Some(t) = dynamodb::table::DynamoDbTable::from_arn(arn, aws.clone()) {
253 return Some(AnyTable::new(t));
254 }
255 None
256 }
257
258 #[cfg(feature = "vista")]
269 pub fn vista_for_name(&self, name: &str) -> Option<(Vista, FactoryMode)> {
270 let aws = self.aws.clone();
271 let factory = aws.vista_factory();
272 let (vista, mode) = match name {
273 "iam.user" => (
274 factory.from_table(iam::users_table(aws)).ok()?,
275 FactoryMode::Single,
276 ),
277 "iam.users" => (
278 factory.from_table(iam::users_table(aws)).ok()?,
279 FactoryMode::List,
280 ),
281 "iam.group" => (
282 factory.from_table(iam::groups_table(aws)).ok()?,
283 FactoryMode::Single,
284 ),
285 "iam.groups" => (
286 factory.from_table(iam::groups_table(aws)).ok()?,
287 FactoryMode::List,
288 ),
289 "iam.role" => (
290 factory.from_table(iam::roles_table(aws)).ok()?,
291 FactoryMode::Single,
292 ),
293 "iam.roles" => (
294 factory.from_table(iam::roles_table(aws)).ok()?,
295 FactoryMode::List,
296 ),
297 "iam.policy" => (
298 factory.from_table(iam::policies_table(aws)).ok()?,
299 FactoryMode::Single,
300 ),
301 "iam.policies" => (
302 factory.from_table(iam::policies_table(aws)).ok()?,
303 FactoryMode::List,
304 ),
305 "iam.instance_profile" => (
306 factory.from_table(iam::instance_profiles_table(aws)).ok()?,
307 FactoryMode::Single,
308 ),
309 "iam.instance_profiles" => (
310 factory.from_table(iam::instance_profiles_table(aws)).ok()?,
311 FactoryMode::List,
312 ),
313 "log.group" => (
314 factory.from_table(logs::groups_table(aws)).ok()?,
315 FactoryMode::Single,
316 ),
317 "log.groups" => (
318 factory.from_table(logs::groups_table(aws)).ok()?,
319 FactoryMode::List,
320 ),
321 "ecs.cluster" => (
322 factory.from_table(ecs::clusters_table(aws)).ok()?,
323 FactoryMode::Single,
324 ),
325 "ecs.clusters" => (
326 factory.from_table(ecs::clusters_table(aws)).ok()?,
327 FactoryMode::List,
328 ),
329 "ecs.task_definition" => (
330 factory.from_table(ecs::task_definitions_table(aws)).ok()?,
331 FactoryMode::Single,
332 ),
333 "ecs.task_definitions" => (
334 factory.from_table(ecs::task_definitions_table(aws)).ok()?,
335 FactoryMode::List,
336 ),
337 "s3.bucket" => (
338 factory.from_table(s3::buckets_table(aws)).ok()?,
339 FactoryMode::Single,
340 ),
341 "s3.buckets" => (
342 factory.from_table(s3::buckets_table(aws)).ok()?,
343 FactoryMode::List,
344 ),
345 "lambda.function" => (
346 factory.from_table(lambda::functions_table(aws)).ok()?,
347 FactoryMode::Single,
348 ),
349 "lambda.functions" => (
350 factory.from_table(lambda::functions_table(aws)).ok()?,
351 FactoryMode::List,
352 ),
353 "dynamodb.table" => (
354 factory.from_table(dynamodb::tables_table(aws)).ok()?,
355 FactoryMode::Single,
356 ),
357 "dynamodb.tables" => (
358 factory.from_table(dynamodb::tables_table(aws)).ok()?,
359 FactoryMode::List,
360 ),
361 _ => return None,
362 };
363 Some((vista, mode))
364 }
365
366 #[cfg(feature = "vista")]
370 pub fn vista_from_arn(&self, arn: &str) -> Option<Vista> {
371 let aws = self.aws.clone();
372 let factory = aws.vista_factory();
373 if let Some(t) = iam::user::User::from_arn(arn, aws.clone()) {
374 return factory.from_table(t).ok();
375 }
376 if let Some(t) = iam::group::Group::from_arn(arn, aws.clone()) {
377 return factory.from_table(t).ok();
378 }
379 if let Some(t) = iam::role::Role::from_arn(arn, aws.clone()) {
380 return factory.from_table(t).ok();
381 }
382 if let Some(t) = iam::policy::Policy::from_arn(arn, aws.clone()) {
383 return factory.from_table(t).ok();
384 }
385 if let Some(t) = iam::instance_profile::InstanceProfile::from_arn(arn, aws.clone()) {
386 return factory.from_table(t).ok();
387 }
388 if let Some(t) = iam::access_key::AccessKey::from_arn(arn, aws.clone()) {
389 return factory.from_table(t).ok();
390 }
391 if let Some(t) = logs::stream::LogStream::from_arn(arn, aws.clone()) {
392 return factory.from_table(t).ok();
393 }
394 if let Some(t) = logs::group::LogGroup::from_arn(arn, aws.clone()) {
395 return factory.from_table(t).ok();
396 }
397 if let Some(t) = ecs::cluster::Cluster::from_arn(arn, aws.clone()) {
398 return factory.from_table(t).ok();
399 }
400 if let Some(t) = s3::object::Object::from_arn(arn, aws.clone()) {
401 return factory.from_table(t).ok();
402 }
403 if let Some(t) = s3::bucket::Bucket::from_arn(arn, aws.clone()) {
404 return factory.from_table(t).ok();
405 }
406 if let Some(t) = lambda::function::Function::from_arn(arn, aws.clone()) {
407 return factory.from_table(t).ok();
408 }
409 if let Some(t) = dynamodb::table::DynamoDbTable::from_arn(arn, aws.clone()) {
410 return factory.from_table(t).ok();
411 }
412 None
413 }
414}