Skip to main content

hive_router_plan_executor/executors/
common.rs

1use 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    // TODO: variables could be stringified before even executing the request
41    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}