four 0.0.13

framework for creating AWS CloudFormation template
Documentation
#![allow(dead_code)]

use serde::{Serialize, Serializer};

use crate::core::{function::Ref, pseudo};

#[non_exhaustive]
#[derive(Debug, Clone, Copy)]
pub enum Region {
    Ref,
    Null,
    Detail(RegionDetail),
}

impl Region {
    pub fn to_str(&self) -> Option<&str> {
        match self {
            Region::Ref => None,
            Region::Null => Some(""),
            Region::Detail(s) => Some(s.to_str()),
        }
    }
}

impl Serialize for Region {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match self {
            Region::Ref => Ref::new(pseudo::Region).serialize(serializer),
            Region::Null => "".serialize(serializer),
            Region::Detail(x) => x.serialize(serializer),
        }
    }
}

#[non_exhaustive]
#[derive(Debug, Clone, Copy)]
pub enum RegionDetail {
    UsEast1,
    ApNortheast1,
}

impl RegionDetail {
    fn to_str(&self) -> &'static str {
        match self {
            RegionDetail::UsEast1 => "us-east-1",
            RegionDetail::ApNortheast1 => "ap-northeast-1",
        }
    }
}

impl Serialize for RegionDetail {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        self.to_str().serialize(serializer)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_region_ref() {
        let s = serde_json::to_string(&Region::Ref).unwrap();
        assert_eq!(s, r#"{"Ref":"AWS::Region"}"#);
    }

    #[test]
    fn test_region_null() {
        let s = serde_json::to_string(&Region::Null).unwrap();
        assert_eq!(s, r#""""#);
    }

    #[test]
    fn test_region_detail1() {
        let s = serde_json::to_string(&Region::Detail(RegionDetail::ApNortheast1)).unwrap();
        assert_eq!(s, r#""ap-northeast-1""#);
    }
}