use cratestack_core::Procedure;
use quote::quote;
use crate::shared::is_stream_procedure;
pub(super) fn procedure_dispatch_tail_tokens(
procedure: &Procedure,
procedure_name: &str,
result_encoder: &proc_macro2::TokenStream,
deprecation_header: &proc_macro2::TokenStream,
) -> proc_macro2::TokenStream {
if is_stream_procedure(procedure) {
let tracing_tail =
result_tracing_tokens(procedure_name, "cratestack procedure stream dispatched");
quote! {
#tracing_tail
let mut response = ::cratestack::encode_transport_stream_result_with_status_for(
&state.codec,
&headers,
&CAPABILITIES,
axum::http::StatusCode::OK,
result,
).await;
#deprecation_header
response
}
} else {
let tracing_tail =
result_tracing_tokens(procedure_name, "cratestack procedure route completed");
quote! {
#tracing_tail
let mut response = #result_encoder;
#deprecation_header
response
}
}
}
fn result_tracing_tokens(procedure_name: &str, ok_message: &str) -> proc_macro2::TokenStream {
quote! {
match &result {
Ok(_) => ::cratestack::tracing::info!(
target: "cratestack",
cratestack_route = canonical_route,
cratestack_procedure = #procedure_name,
cratestack_operation = "procedure",
cratestack_authenticated = ctx.is_authenticated(),
cratestack_duration_ms = started.elapsed().as_millis() as u64,
cratestack_request_id = ctx.request_id().unwrap_or(""),
#ok_message,
),
Err(error) => ::cratestack::tracing::warn!(
target: "cratestack",
cratestack_route = canonical_route,
cratestack_procedure = #procedure_name,
cratestack_operation = "procedure",
cratestack_authenticated = ctx.is_authenticated(),
cratestack_error = error.code(),
cratestack_detail = error.detail().unwrap_or(""),
cratestack_duration_ms = started.elapsed().as_millis() as u64,
cratestack_request_id = ctx.request_id().unwrap_or(""),
"cratestack procedure route failed",
),
}
}
}