terrars 0.1.13

Terraform in Rust
Documentation
use serde::Serialize;
use crate::{
    TfPrimitiveType,
    list_ref::{
        ListRef,
        MapListRef,
    },
    rec_ref::MapRecRefToList,
};

pub enum ListField<T> {
    Literal(Vec<T>),
    Sentinel(String),
}

impl<T: Serialize> Serialize for ListField<T> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer {
        match self {
            ListField::Literal(x) => x.serialize(serializer),
            ListField::Sentinel(t) => t.serialize2(serializer),
        }
    }
}

impl<T> From<Vec<T>> for ListField<T> {
    fn from(value: Vec<T>) -> Self {
        Self::Literal(value)
    }
}

impl<T> From<&ListRef<T>> for ListField<T> {
    fn from(value: &ListRef<T>) -> Self {
        Self::Sentinel(value.shared.add_sentinel(&value.base))
    }
}

impl<T> From<ListRef<T>> for ListField<T> {
    fn from(value: ListRef<T>) -> Self {
        (&value).into()
    }
}

impl<T> From<&MapListRef<T>> for ListField<T> {
    fn from(value: &MapListRef<T>) -> Self {
        Self::Sentinel(
            value
                .shared
                .add_sentinel(
                    &format!(
                        "[for each in [for i, v in {}: {{ key = i, value = v }}]: {}]",
                        value.base,
                        value.map_base
                    ),
                ),
        )
    }
}

impl<T> From<MapListRef<T>> for ListField<T> {
    fn from(value: MapListRef<T>) -> Self {
        (&value).into()
    }
}

impl<T> From<&MapRecRefToList<T>> for ListField<T> {
    fn from(value: &MapRecRefToList<T>) -> Self {
        Self::Sentinel(
            value
                .shared
                .add_sentinel(
                    &format!(
                        "[for each in [for k, v in {}: {{ key = k, value = v }}]: {}]",
                        value.base,
                        value.map_base
                    ),
                ),
        )
    }
}

impl<T> From<MapRecRefToList<T>> for ListField<T> {
    fn from(value: MapRecRefToList<T>) -> Self {
        (&value).into()
    }
}