pub(crate) fn validate_key(key: &str) -> anyhow::Result<()> {
if key.is_empty() {
bail!("lock key must not be empty");
}
if key.len() > 200 {
bail!("lock key must be at most 200 bytes: got {}", key.len());
}
let first = key.chars().next().unwrap();
if !first.is_ascii_alphanumeric() {
bail!("lock key must start with a letter or digit: {:?}", key);
}
let last = key.chars().last().unwrap();
if !last.is_ascii_alphanumeric() {
bail!("lock key must end with a letter or digit: {:?}", key);
}
for c in key.chars() {
let ok = c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '.';
if !ok {
bail!(
"lock key must contain only ASCII alphanumeric, '-', '_', '.': {:?}",
key,
);
}
}
Ok(())
}