use serde::{Deserialize, Serialize};
use vantage_table::table::Table;
use crate::types::{Arn, AwsDateTime};
use crate::{AwsAccount, eq};
use super::access_key::{AccessKey, access_keys_table};
use super::attached_policy::{AttachedPolicy, attached_user_policies_table};
use super::group::{Group, groups_for_user_table};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
#[serde(rename = "UserName")]
pub user_name: String,
#[serde(rename = "UserId", default)]
pub user_id: String,
#[serde(rename = "Arn", default)]
pub arn: String,
#[serde(rename = "Path", default)]
pub path: String,
#[serde(rename = "CreateDate", default)]
pub create_date: String,
#[serde(rename = "PasswordLastUsed", default)]
pub password_last_used: String,
}
pub fn users_table(aws: AwsAccount) -> Table<AwsAccount, User> {
Table::new("query/Users:iam/2010-05-08.ListUsers", aws)
.with_id_column("UserName")
.with_column_of::<String>("UserId")
.with_column_of::<Arn>("Arn")
.with_title_column_of::<String>("Path")
.with_title_column_of::<AwsDateTime>("CreateDate")
.with_column_of::<AwsDateTime>("PasswordLastUsed")
.with_many("groups", "UserName", groups_for_user_table)
.with_many("access_keys", "UserName", access_keys_table)
.with_many(
"attached_policies",
"UserName",
attached_user_policies_table,
)
}
impl User {
pub fn from_arn(arn: &str, aws: AwsAccount) -> Option<Table<AwsAccount, User>> {
let name = arn.strip_prefix("arn:aws:iam::")?.split(":user/").nth(1)?;
if name.is_empty() {
return None;
}
let mut t = users_table(aws);
t.add_condition(eq("UserName", name.to_string()));
Some(t)
}
pub fn ref_groups(&self, aws: AwsAccount) -> Table<AwsAccount, Group> {
let mut t = groups_for_user_table(aws);
t.add_condition(eq("UserName", self.user_name.clone()));
t
}
pub fn ref_access_keys(&self, aws: AwsAccount) -> Table<AwsAccount, AccessKey> {
let mut t = access_keys_table(aws);
t.add_condition(eq("UserName", self.user_name.clone()));
t
}
pub fn ref_attached_policies(&self, aws: AwsAccount) -> Table<AwsAccount, AttachedPolicy> {
let mut t = attached_user_policies_table(aws);
t.add_condition(eq("UserName", self.user_name.clone()));
t
}
}