use serde::{Deserialize, Serialize};
use vantage_table::table::Table;
use crate::types::{Arn, AwsDateTime};
use crate::{AwsAccount, eq};
use super::attached_policy::{AttachedPolicy, attached_group_policies_table};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Group {
#[serde(rename = "GroupName")]
pub group_name: String,
#[serde(rename = "GroupId", default)]
pub group_id: String,
#[serde(rename = "Arn", default)]
pub arn: String,
#[serde(rename = "Path", default)]
pub path: String,
#[serde(rename = "CreateDate", default)]
pub create_date: String,
}
pub fn groups_table(aws: AwsAccount) -> Table<AwsAccount, Group> {
Table::new("query/Groups:iam/2010-05-08.ListGroups", aws)
.with_id_column("GroupName")
.with_column_of::<String>("GroupId")
.with_column_of::<Arn>("Arn")
.with_title_column_of::<String>("Path")
.with_title_column_of::<AwsDateTime>("CreateDate")
.with_many(
"attached_policies",
"GroupName",
attached_group_policies_table,
)
}
pub(crate) fn groups_for_user_table(aws: AwsAccount) -> Table<AwsAccount, Group> {
Table::new("query/Groups:iam/2010-05-08.ListGroupsForUser", aws)
.with_id_column("GroupName")
.with_column_of::<String>("GroupId")
.with_column_of::<Arn>("Arn")
.with_column_of::<String>("Path")
.with_column_of::<AwsDateTime>("CreateDate")
}
impl Group {
pub fn from_arn(arn: &str, aws: AwsAccount) -> Option<Table<AwsAccount, Group>> {
let name = arn.strip_prefix("arn:aws:iam::")?.split(":group/").nth(1)?;
if name.is_empty() {
return None;
}
let mut t = groups_table(aws);
t.add_condition(eq("GroupName", name.to_string()));
Some(t)
}
pub fn ref_attached_policies(&self, aws: AwsAccount) -> Table<AwsAccount, AttachedPolicy> {
let mut t = attached_group_policies_table(aws);
t.add_condition(eq("GroupName", self.group_name.clone()));
t
}
}