hive_router_plan_executor/executors/
common.rs1use std::{collections::HashMap, sync::Arc, time::Duration};
2
3use async_trait::async_trait;
4use http::{HeaderMap, Uri};
5use sonic_rs::Value;
6
7use crate::{
8 executors::error::SubgraphExecutorError, plugin_context::PluginRequestState,
9 response::subgraph_response::SubgraphResponse,
10};
11
12#[async_trait]
13pub trait SubgraphExecutor {
14 fn endpoint(&self) -> &Uri;
15 async fn execute<'a>(
16 &self,
17 execution_request: SubgraphExecutionRequest<'a>,
18 timeout: Option<Duration>,
19 plugin_req_state: &'a Option<PluginRequestState<'a>>,
20 ) -> Result<SubgraphResponse<'a>, SubgraphExecutorError>;
21
22 fn to_boxed_arc<'a>(self) -> Arc<Box<dyn SubgraphExecutor + Send + Sync + 'a>>
23 where
24 Self: Sized + Send + Sync + 'a,
25 {
26 Arc::new(Box::new(self))
27 }
28}
29
30pub type SubgraphExecutorType = dyn crate::executors::common::SubgraphExecutor + Send + Sync;
31
32pub type SubgraphExecutorBoxedArc = Arc<Box<SubgraphExecutorType>>;
33
34pub type SubgraphRequestExtensions = HashMap<String, Value>;
35
36pub struct SubgraphExecutionRequest<'a> {
37 pub query: &'a str,
38 pub dedupe: bool,
39 pub operation_name: Option<&'a str>,
40 pub variables: Option<HashMap<&'a str, &'a sonic_rs::Value>>,
42 pub headers: HeaderMap,
43 pub representations: Option<Vec<u8>>,
44 pub extensions: Option<SubgraphRequestExtensions>,
45}
46
47impl SubgraphExecutionRequest<'_> {
48 pub fn add_request_extensions_field(&mut self, key: String, value: Value) {
49 self.extensions
50 .get_or_insert_with(HashMap::new)
51 .insert(key, value);
52 }
53}