use std::{borrow::Cow, collections::HashMap, marker::PhantomData};
use crate::{ExtensionType, ZarrVersion};
pub type ExtensionNameMap = HashMap<&'static str, Cow<'static, str>>;
pub type ExtensionAliasMapString = HashMap<Cow<'static, str>, &'static str>;
pub type ExtensionAliasMapRegex = Vec<(regex::Regex, &'static str)>;
#[derive(Debug)]
pub struct ExtensionAliases<Z: ZarrVersion, T: ExtensionType> {
zarr_version: PhantomData<Z>,
extension_type: PhantomData<T>,
pub default_names: ExtensionNameMap,
pub aliases_str: ExtensionAliasMapString,
pub aliases_regex: ExtensionAliasMapRegex,
}
impl<Z: ZarrVersion, T: ExtensionType> ExtensionAliases<Z, T> {
#[must_use]
pub fn new(
default_names: ExtensionNameMap,
aliases_str: ExtensionAliasMapString,
aliases_regex: ExtensionAliasMapRegex,
) -> Self {
Self {
zarr_version: PhantomData,
extension_type: PhantomData,
default_names,
aliases_str,
aliases_regex,
}
}
pub fn default_name<'a>(&'a self, identifier: &'a str) -> &'a str {
self.default_names
.get(identifier)
.map_or(identifier, AsRef::as_ref)
}
#[must_use]
pub fn identifier<'a>(&'a self, name: &'a str) -> &'a str {
if let Some(alias) = self.aliases_str.get(name) {
alias
} else {
for (regex, identifier) in &self.aliases_regex {
if regex.is_match(name) {
return self.aliases_str.get(*identifier).unwrap_or(identifier);
}
}
name
}
}
}