#[allow(unused_macros)]
macro_rules! provider_singleton_state {
(
name = $struct_name:ident,
static_name = $static_name:ident,
rate_const = $rate_const:ident,
provider_key = $provider_key:literal,
already_init_reason = $already_init_reason:literal $(,)?
) => {
struct $struct_name {
api_key: ::std::string::String,
timeout: ::std::time::Duration,
limiter: ::std::sync::Arc<crate::rate_limiter::RateLimiter>,
}
static $static_name: ::std::sync::OnceLock<$struct_name> = ::std::sync::OnceLock::new();
fn set_singleton(
api_key: impl Into<::std::string::String>,
timeout: ::std::time::Duration,
) -> crate::error::Result<()> {
$static_name
.set($struct_name {
api_key: api_key.into(),
timeout,
limiter: ::std::sync::Arc::new(crate::rate_limiter::RateLimiter::new(
$rate_const,
)),
})
.map_err(|_| crate::error::FinanceError::InvalidParameter {
param: $provider_key.to_string(),
reason: $already_init_reason.to_string(),
})
}
};
}
#[allow(unused_macros)]
macro_rules! provider_build_client {
(
name = $struct_name:ident,
static_name = $static_name:ident,
rate_const = $rate_const:ident,
provider_key = $provider_key:literal,
env_var = $env_var:literal,
env_missing_reason = $env_missing_reason:literal,
builder = $builder:path,
client_ty = $client_ty:ty $(,)?
) => {
pub(crate) fn build_client() -> crate::error::Result<$client_ty> {
if $static_name.get().is_none()
&& let Ok(key) = ::std::env::var($env_var)
{
let _ = $static_name.set($struct_name {
api_key: key,
timeout: ::std::time::Duration::from_secs(30),
limiter: ::std::sync::Arc::new(crate::rate_limiter::RateLimiter::new(
$rate_const,
)),
});
}
let s =
$static_name
.get()
.ok_or_else(|| crate::error::FinanceError::InvalidParameter {
param: $provider_key.to_string(),
reason: $env_missing_reason.to_string(),
})?;
<$builder>::new(&s.api_key)
.timeout(s.timeout)
.build_with_limiter(::std::sync::Arc::clone(&s.limiter))
}
#[cfg(test)]
pub(crate) fn build_test_client(base_url: &str) -> crate::error::Result<$client_ty> {
<$builder>::new("test-key")
.timeout(::std::time::Duration::from_secs(5))
.base_url(base_url)
.build_with_limiter(::std::sync::Arc::new(
crate::rate_limiter::RateLimiter::new(100.0),
))
}
};
}
#[allow(unused_imports)]
pub(crate) use provider_build_client;
#[allow(unused_imports)]
pub(crate) use provider_singleton_state;