mod client;
pub(crate) mod models;
pub(crate) mod commodities; pub(crate) mod corporate; pub(crate) mod crypto; pub(crate) mod discovery; pub(crate) mod forex; pub(crate) mod fundamentals; pub(crate) mod indices; pub(crate) mod market;
pub(crate) mod quote; pub(crate) mod technicals;
use crate::adapters::singleton::{provider_build_client, provider_singleton_state};
use crate::error::Result;
use std::time::Duration;
pub use models::*;
const FMP_RATE_PER_SEC: f64 = 5.0;
provider_singleton_state!(
name = FmpSingleton,
static_name = FMP_SINGLETON,
rate_const = FMP_RATE_PER_SEC,
provider_key = "fmp",
already_init_reason = "FMP client already initialized",
);
provider_build_client!(
name = FmpSingleton,
static_name = FMP_SINGLETON,
rate_const = FMP_RATE_PER_SEC,
provider_key = "fmp",
env_var = "FMP_API_KEY",
env_missing_reason = "FMP_API_KEY not set. Call fmp::init(key) or set FMP_API_KEY env var.",
builder = client::FmpClientBuilder,
client_ty = client::FmpClient,
);
#[allow(dead_code)]
pub fn init(api_key: impl Into<String>) -> Result<()> {
init_with_timeout(api_key, Duration::from_secs(30))
}
#[allow(dead_code)]
pub fn init_with_timeout(api_key: impl Into<String>, timeout: Duration) -> Result<()> {
set_singleton(api_key, timeout)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::error::FinanceError;
#[test]
fn test_init_errors_on_double_init() {
let _ = init("test-key-1");
let result = init("test-key-2");
assert!(matches!(result, Err(FinanceError::InvalidParameter { .. })));
}
}