use core::fmt::Display;
use std::collections::HashMap as StdHashMap;
use kstring::KString;
use tap::Pipe;
use crate::{
TemplateResolver,
error::{ResolverError, ResolverResult},
parsers::parse_value_or_map_err,
resolver::TemplateAST,
};
impl<K, V, S> TryFrom<StdHashMap<K, V, S>> for TemplateResolver
where
K: Into<KString> + Display,
V: AsRef<str>,
{
type Error = ResolverError;
fn try_from(value: StdHashMap<K, V, S>) -> Result<Self, Self::Error> {
Self::try_from_raw(value)
}
}
impl<K, V, S> TryFrom<ahash::AHashMap<K, V, S>> for TemplateResolver
where
K: Into<KString> + Display,
V: AsRef<str>,
{
type Error = ResolverError;
fn try_from(value: ahash::AHashMap<K, V, S>) -> Result<Self, Self::Error> {
Self::try_from_raw(value)
}
}
impl<K, V> TryFrom<Vec<(K, V)>> for TemplateResolver
where
K: Into<KString> + Display,
V: AsRef<str>,
{
type Error = ResolverError;
fn try_from(value: Vec<(K, V)>) -> Result<Self, Self::Error> {
Self::try_from_raw(value)
}
}
impl TemplateResolver {
pub fn try_from_raw<K, V, I>(iter: I) -> ResolverResult<Self>
where
K: Into<KString> + Display,
V: AsRef<str>,
I: IntoIterator<Item = (K, V)>,
{
iter
.into_iter()
.map(|(key, value)| {
parse_value_or_map_err(&key, value.as_ref()) .map(|tmpl| (key.into(), tmpl))
})
.collect::<Result<TemplateAST, _>>()?
.pipe(Self)
.pipe(Ok)
}
}