use crate::{EnvError, EnvString, FromEnvString, ToEnvString};

pub(crate) fn parse_env_variable<T>(env_name: &str, env_str: EnvString) -> Result<T, EnvError>
where
    T: FromEnvString,
{
    FromEnvString::from_env_string(&env_str)
        .map_err(|_| EnvError::FailedToParse(env_name.to_string()))
}

pub(crate) fn make_panic<T>(e: EnvError) -> T {
    panic!("{}", e)
}

pub(crate) fn join(env_strings: &[EnvString], sep: &str) -> String {
    env_strings
        .iter()
        .enumerate()
        .fold(String::new(), |mut res, (i, item)| {
            if i > 0 {
                res.push_str(sep);
            }
            res.push_str(item);
            res
        })
}

pub(crate) fn vec_to_env_strings<T>(values: Vec<T>) -> Vec<EnvString>
where
    T: ToEnvString,
{
    values.into_iter().map(EnvString::from).collect()
}