four 0.0.13

framework for creating AWS CloudFormation template
Documentation
use derive_new::new;
use nutype::nutype;
use serde::Serialize;

use crate::convert::WillBe;

#[nutype(
    validate(not_empty, len_char_max = 256),
    derive(Debug, Clone, Serialize)
)]
pub struct AliasDescription(String);

#[nutype(
    validate(regex = r#"\$LATEST|[0-9]+"#),
    derive(Debug, Clone, Serialize)
)]
pub struct FunctionVersion(String);

#[nutype(validate(regex = r#"[a-zA-Z0-9-_]+"#), derive(Debug, Clone, Serialize))]
pub struct AliasName(String);

#[derive(Debug, Clone, Serialize, new)]
#[serde(rename_all = "PascalCase")]
pub struct AliasRoutingConfiguration {
    additional_version_weights: Vec<VersionWeight>,
}

#[derive(Debug, Clone, Serialize, new)]
#[serde(rename_all = "PascalCase")]
pub struct VersionWeight {
    function_version: WillBe<FunctionVersion>,
    function_weight: f32,
}

pub fn version_weight(version: WillBe<FunctionVersion>, weight: f32) -> AliasRoutingConfiguration {
    AliasRoutingConfiguration {
        additional_version_weights: vec![VersionWeight::new(version, weight)],
    }
}

pub fn version_weights<W: IntoIterator<Item = (WillBe<FunctionVersion>, f32)>>(
    weights: W,
) -> AliasRoutingConfiguration {
    let weights = weights
        .into_iter()
        .map(|(v, w)| VersionWeight::new(v, w))
        .collect();
    AliasRoutingConfiguration {
        additional_version_weights: weights,
    }
}