use lambda_runtime::tracing::Span;
use opentelemetry::{Key as OtelKey, Value as OtelValue};
use std::collections::HashMap;
use std::sync::Arc;
use tracing_opentelemetry::OpenTelemetrySpanExt;
#[derive(Debug, Clone)]
pub struct RouteContext<State: Clone, E> {
pub path: String,
pub method: String,
pub params: HashMap<String, String>,
pub state: Arc<State>,
pub event: E,
pub lambda_context: lambda_runtime::Context,
pub route_pattern: String,
}
impl<State: Clone, E> RouteContext<State, E> {
pub fn path(&self) -> &str {
&self.path
}
pub fn method(&self) -> &str {
&self.method
}
pub fn state(&self) -> &State {
&self.state
}
pub fn event(&self) -> &E {
&self.event
}
pub fn lambda_context(&self) -> &lambda_runtime::Context {
&self.lambda_context
}
pub fn route_pattern(&self) -> &str {
&self.route_pattern
}
pub fn get_param(&self, name: &str) -> Option<String> {
self.params.get(name).cloned()
}
pub fn get_param_or(&self, name: &str, default: &str) -> String {
self.get_param(name).unwrap_or_else(|| default.to_string())
}
pub fn get_param_or_empty(&self, name: &str) -> String {
self.get_param_or(name, "")
}
pub fn params(&self) -> &HashMap<String, String> {
&self.params
}
pub fn set_otel_attribute(
&self,
key: impl Into<OtelKey>,
value: impl Into<OtelValue>,
) -> &Self {
let span = Span::current();
span.set_attribute(key, value);
self
}
pub fn set_otel_span_kind(&self, kind: &str) -> &Self {
let span = Span::current();
span.record("otel.kind", kind);
self
}
}