Codex Handbook
otel/src/metrics/validation.rs 55 lines
use crate::metrics::error::MetricsError;use crate::metrics::error::Result;use std::collections::BTreeMap;pub(crate) fn validate_tags(tags: &BTreeMap<String, String>) -> Result<()> {    for (key, value) in tags {        validate_tag_key(key)?;        validate_tag_value(value)?;    }    Ok(())}pub(crate) fn validate_metric_name(name: &str) -> Result<()> {    if name.is_empty() {        return Err(MetricsError::EmptyMetricName);    }    if !name.chars().all(is_metric_char) {        return Err(MetricsError::InvalidMetricName {            name: name.to_string(),        });    }    Ok(())}pub(crate) fn validate_tag_key(key: &str) -> Result<()> {    validate_tag_component(key, "tag key")?;    Ok(())}pub(crate) fn validate_tag_value(value: &str) -> Result<()> {    validate_tag_component(value, "tag value")}fn validate_tag_component(value: &str, label: &str) -> Result<()> {    if value.is_empty() {        return Err(MetricsError::EmptyTagComponent {            label: label.to_string(),        });    }    if !value.chars().all(is_tag_char) {        return Err(MetricsError::InvalidTagComponent {            label: label.to_string(),            value: value.to_string(),        });    }    Ok(())}fn is_metric_char(c: char) -> bool {    c.is_ascii_alphanumeric() || matches!(c, '.' | '_' | '-')}fn is_tag_char(c: char) -> bool {    c.is_ascii_alphanumeric() || matches!(c, '.' | '_' | '-' | '/')}