Skip to main content

hive_console_sdk/supergraph_fetcher/
mod.rs

1use tokio::sync::RwLock;
2use tokio::sync::TryLockError;
3
4use crate::circuit_breaker::CircuitBreakerError;
5use crate::supergraph_fetcher::async_fetcher::SupergraphFetcherAsyncState;
6use reqwest::header::HeaderValue;
7use reqwest::header::InvalidHeaderValue;
8
9pub mod async_fetcher;
10pub mod builder;
11pub mod sync_fetcher;
12
13#[derive(Debug)]
14pub struct SupergraphFetcher<State> {
15    state: State,
16    etag: RwLock<Option<HeaderValue>>,
17}
18
19// Doesn't matter which one we implement this for, both have the same builder
20impl SupergraphFetcher<SupergraphFetcherAsyncState> {
21    pub fn builder() -> builder::SupergraphFetcherBuilder {
22        builder::SupergraphFetcherBuilder::default()
23    }
24}
25
26pub enum LockErrorType {
27    Read,
28    Write,
29}
30
31#[derive(Debug, thiserror::Error)]
32pub enum SupergraphFetcherError {
33    #[error("Creating HTTP Client failed: {0}")]
34    HTTPClientCreation(reqwest::Error),
35    #[error("Network error: {0}")]
36    Network(reqwest_middleware::Error),
37    #[error("Parsing response failed: {0}")]
38    ResponseParse(reqwest::Error),
39    #[error("Reading the etag record failed: {0:?}")]
40    ETagRead(TryLockError),
41    #[error("Updating the etag record failed: {0:?}")]
42    ETagWrite(TryLockError),
43    #[error("Invalid CDN key: {0}")]
44    InvalidKey(InvalidHeaderValue),
45    #[error("Missing configuration option: {0}")]
46    MissingConfigurationOption(String),
47    #[error("Request rejected by circuit breaker")]
48    RejectedByCircuitBreaker,
49    #[error("Creating circuit breaker failed: {0}")]
50    CircuitBreakerCreation(CircuitBreakerError),
51}