use std::collections::HashMap;
use lazy_static::lazy_static;
use regex::Regex;
use crate::{format_err, Result};
use super::ColumnNameCleaner;
lazy_static! {
static ref SAFE_NAME_REGEX: Regex =
Regex::new("^[_a-z][_a-z0-9]*$").expect("invalid regex in source");
}
#[derive(Default)]
pub struct StableCleaner {
used: HashMap<String, String>,
}
impl ColumnNameCleaner for StableCleaner {
fn unique_id_for(&mut self, name: &str) -> Result<String> {
let normalized = name.to_ascii_lowercase().replace(' ', "_");
if !SAFE_NAME_REGEX.is_match(&normalized) {
return Err(format_err!("invalid column name: {:?}", name));
}
if let Some(conflicting_name) =
self.used.insert(normalized.to_owned(), name.to_owned())
{
return Err(format_err!(
"conflicting column names {:?} and {:?} would both map to {:?}",
conflicting_name,
name,
normalized
));
};
Ok(normalized)
}
}