dotenv_config_ext 0.1.3

parse `env` to config struct for Rust
Documentation
impl {{ name }} {
    pub async fn init() -> Result<{{ name }}, &'static str> {
        let mut key: &str;
        {% for field in fields %}
        {% if field.attr_name.is_empty() %}
        key = "{{ uppersnake((name.clone() + "_" + field.name.as_str()).as_str()) }}";
        {% else %}
        key = "{{ field.attr_name }}";
        {% endif %}
        {% if contains(["usize","i16","i32","i64","u16","u32","u64","f32","f64","String","bool"], field.typ) %}
        let {{ field.name }}: Option<{{ field.typ }}> = match std::env::var(key) {
            Ok(val) => match val.parse() {
                {% if parse_bool(field.attr_ext) %}
                Ok(v) => Some({{ field.attr_ext_post_with }}(v).await.unwrap()),
                {% else %}
                Ok(v) => Some(v),
                {% endif %}
                Err(_) => Some("".parse().unwrap()),
            },
            Err(err) => {
                {% if field.attr_default.is_empty() %}
                Some(Default::default())
                {% else %}
                Some("{{ field.attr_default }}".parse().unwrap())
                {% endif %}
            }
        };
        {% else %}
        let {{ field.name }}: Option<{{ field.typ }}> = match {{ field.typ }}::init().await {
            {% if parse_bool(field.attr_ext) %}
            Ok(v) => Some({{ field.attr_ext_post_with }}(v).await.unwrap()),
            {% else %}
            Ok(v) => Some(v),
            {% endif %}
            Err(_) => None,
        };
        {% endif %}
        {% endfor %}

        Ok({{ name }} {
            {% for field in fields %}
            {% if field.optional %}
            {{ field.name }}: {{ field.name }},
            {% else %}
            {{ field.name }}: {{ field.name }}.ok_or("Build failed: missing {{ field.name }}")?,
            {% endif %}
            {% endfor %}
        })
    }
}