four 0.0.13

framework for creating AWS CloudFormation template
Documentation
use crate::core::{function::join::Join, pseudo::PseudoParam, LogicalId};
use serde::{ser::SerializeMap, Serialize};
pub trait Referenced {
    type To;

    fn referenced(&self) -> RefInner;
}

#[derive(Debug, Clone)]
pub enum RefInner {
    Id(LogicalId),
    PseudoParam(PseudoParam),
    Join(Join),
}

impl Serialize for RefInner {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        match self {
            RefInner::Id(id) => id.serialize(serializer),
            RefInner::PseudoParam(param) => param.serialize(serializer),
            RefInner::Join(join) => join.serialize(serializer),
        }
    }
}

#[derive(Debug, Clone)]
pub struct Ref {
    inner: RefInner,
}

impl Ref {
    pub fn new<R: Referenced>(r: R) -> Ref {
        Ref {
            inner: r.referenced(),
        }
    }
}

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