four 0.0.13

framework for creating AWS CloudFormation template
Documentation
use crate::core::logical_id::{LogicalId, LogicalIdentified};
use serde::{
    ser::{SerializeMap, SerializeSeq},
    Serialize,
};

pub trait HaveAtt<A>: LogicalIdentified {
    const KEY: &'static str;
}

#[derive(Debug, Clone)]
pub struct GetAtt {
    logical_id: LogicalId,
    name: &'static str,
}

impl GetAtt {
    pub(crate) fn new<A, H: HaveAtt<A>>(resource: &H) -> GetAtt {
        GetAtt {
            logical_id: resource.logical_id().clone(),
            name: H::KEY,
        }
    }
}

impl Serialize for GetAtt {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let inner = GetAttInner {
            logical_id: &self.logical_id,
            name: self.name,
        };
        let mut map = serializer.serialize_map(Some(1))?;
        map.serialize_entry("Fn::GetAtt", &inner)?;
        map.end()
    }
}

struct GetAttInner<'a> {
    logical_id: &'a LogicalId,
    name: &'a str,
}

impl Serialize for GetAttInner<'_> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let mut seq = serializer.serialize_seq(Some(2))?;
        seq.serialize_element(self.logical_id)?;
        seq.serialize_element(self.name)?;
        seq.end()
    }
}