use std::{collections::HashMap, fmt::Display, str::FromStr};
use super::StorageError;
pub(crate) type StorageOptions = HashMap<String, String>;
pub(crate) fn apply<K, B>(
builder: B,
opts: &StorageOptions,
uri: &str,
fold: impl Fn(B, K, &str) -> B,
) -> Result<B, StorageError>
where
K: FromStr,
<K as FromStr>::Err: Display,
{
let mut builder = builder;
for (key, value) in opts {
let parsed = K::from_str(key).map_err(|e| StorageError::Permanent {
uri: uri.to_string(),
source: format!("invalid storage option '{key}': {e}").into(),
})?;
builder = fold(builder, parsed, value);
}
Ok(builder)
}