four_iam 0.0.6

framework for creating AWS CloudFormation template
Documentation
use four::{
    arn::Arn,
    convert::{WillBe, WillMappable},
    function::{
        getatt::{Attribute, HaveAtt},
        reference::Referenced,
    },
    logical_id::LogicalId,
    service::IAM,
    ManagedResource,
};
use serde::Serialize;

use crate::resource::{managed_policy::ManagedPolicyArn, policy::Policy};

#[derive(ManagedResource, Clone)]
#[resource_type = "AWS::IAM::Group"]
pub struct Group {
    logical_id: LogicalId,
    group_name: Option<WillBe<GroupName>>,
    managed_policy_arns: Option<Vec<WillBe<ManagedPolicyArn>>>,
    path: Option<String>,
    policies: Option<Vec<Policy>>,
}

impl Group {
    pub fn new(logical_id: LogicalId) -> Group {
        Group {
            logical_id,
            group_name: None,
            managed_policy_arns: None,
            path: None,
            policies: None,
        }
    }

    pub fn group_name(mut self, name: WillBe<GroupName>) -> Group {
        self.group_name = Some(name);
        self
    }

    pub fn managed_policy_arns(mut self, arns: Vec<WillBe<ManagedPolicyArn>>) -> Group {
        self.managed_policy_arns = Some(arns);
        self
    }

    pub fn path(mut self, path: String) -> Group {
        self.path = Some(path);
        self
    }

    pub fn policies(mut self, policies: Vec<Policy>) -> Group {
        self.policies = Some(policies);
        self
    }
}

#[derive(Debug, Clone, Serialize)]
pub struct GroupName(String);

impl WillMappable<String> for GroupName {}

impl Referenced for Group {
    type To = GroupName;

    fn referenced(&self) -> four::function::reference::RefInner {
        four::function::reference::RefInner::Id(self.logical_id.clone())
    }
}

#[derive(Debug, Clone, Serialize)]
pub struct GroupArn(Arn<IAM>);

impl Attribute for GroupArn {
    fn name() -> &'static str {
        "Arn"
    }
}

impl HaveAtt<GroupArn> for Group {}