yomo 0.6.4

A QUIC-based runtime for AI-LLM tool routing and serverless execution
Documentation
use anyhow::{Result, bail};
use opentelemetry::trace::TraceContextExt;
use opentelemetry_sdk::trace::{IdGenerator, RandomIdGenerator};
use tracing::{Span, debug_span};
use tracing_opentelemetry::OpenTelemetrySpanExt;

pub fn sanitize_name(name: &str) -> Result<String> {
    let sanitized = name
        .chars()
        .map(|ch| {
            if ch.is_ascii_alphanumeric() || ch == '-' || ch == '_' {
                ch
            } else {
                '_'
            }
        })
        .collect::<String>();

    if sanitized.is_empty() {
        bail!("name is empty");
    }

    Ok(sanitized)
}

pub(crate) fn start_request_span(method: &str, route: &str) -> (Span, String) {
    let root_span = debug_span!("http.request", http.method = method, http.route = route);
    let trace_id = {
        let span_context = root_span.context().span().span_context().clone();
        if span_context.is_valid() {
            span_context.trace_id().to_string()
        } else {
            RandomIdGenerator::default().new_trace_id().to_string()
        }
    };
    (root_span, trace_id)
}