cronback_lib/
grpc_helpers.rs1use tonic::service::Interceptor;
2
3use crate::model::ValidShardedId;
4use crate::prelude::*;
5use crate::types::{ProjectId, RequestId};
6
7#[derive(Debug, Clone)]
8pub struct RequestContext {
9 pub request_id: RequestId,
10 pub project_id: ValidShardedId<ProjectId>,
11}
12
13impl RequestContext {
14 pub fn new(
15 request_id: RequestId,
16 project_id: ValidShardedId<ProjectId>,
17 ) -> Self {
18 Self {
19 request_id,
20 project_id,
21 }
22 }
23}
24
25pub struct GrpcRequestInterceptor {
28 pub project_id: Option<ValidShardedId<ProjectId>>,
29 pub request_id: Option<RequestId>,
30}
31
32impl Interceptor for GrpcRequestInterceptor {
33 fn call(
34 &mut self,
35 mut req: tonic::Request<()>,
36 ) -> Result<tonic::Request<()>, tonic::Status> {
37 if let Some(span_id) = tracing::Span::current().id() {
38 let span_id = format!("{}", span_id.into_u64());
39 req.metadata_mut()
40 .insert(PARENT_SPAN_HEADER, span_id.parse().unwrap());
41 }
42
43 if let Some(ref request_id) = self.request_id {
44 req.metadata_mut().set_request_id(request_id.clone());
47 }
48
49 if let Some(ref project_id) = self.project_id {
50 req.metadata_mut().set_project_id(project_id.clone());
53 }
54 Ok(req)
55 }
56}