use once_cell::sync::Lazy;
use regex::Regex;
static VALID_NAME_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^[[:alpha:]_][[:alnum:]_]*$").unwrap());
#[derive(thiserror::Error, Debug)]
#[error("invalid metric or label name")]
pub struct NameError;
pub fn is_valid_name<S: AsRef<str>>(name: S) -> bool {
let name = name.as_ref();
if name.starts_with("__") {
false
} else {
VALID_NAME_REGEX.is_match(name.as_ref())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn good_metric_name() {
assert!(is_valid_name("test"));
}
#[test]
fn good_alnum_metric_name() {
assert!(is_valid_name("test_0"));
}
#[test]
fn bad_alnum_metric_name() {
assert!(!is_valid_name("0_test"));
}
#[test]
fn dubious_metric_name() {
assert!(is_valid_name("test__"));
}
#[test]
fn very_dubious_metric_name() {
assert!(is_valid_name("_test"));
}
#[test]
fn bad_metric_name() {
assert!(!is_valid_name("__test"));
}
}