use std::borrow::Cow;
use crate::{Error, elm::RESERVED_TYPE_NAMES};
pub(crate) fn is_elm_identifier(name: &str) -> bool {
let mut chars = name.chars();
let Some(first) = chars.next() else {
return false;
};
first.is_ascii_lowercase()
&& chars.all(|ch| ch.is_ascii_alphanumeric() || ch == '_')
&& !RESERVED_TYPE_NAMES.contains(&name)
}
pub(crate) fn sanitise_key(
field_name: Cow<'static, str>,
maybe_path: Option<&str>,
) -> Result<Cow<'static, str>, Error> {
if is_elm_identifier(&field_name) {
return Ok(field_name);
}
let mut chars = field_name.chars();
if let Some(first) = chars.next()
&& first.is_ascii_uppercase()
{
let candidate: String = first.to_ascii_lowercase().to_string() + chars.as_str();
if is_elm_identifier(&candidate) {
return Ok(Cow::Owned(candidate));
}
}
Err(Error::invalid_map_key(
maybe_path.unwrap_or("").to_string(),
field_name.to_string(),
))
}