use std::sync::Arc;
use crate::shared::rest::{
error::Result,
lnm::{base::LnmRestBase, rate_limit::RateLimiter},
};
pub(super) mod config;
pub(crate) mod error;
mod lnm;
pub(super) mod models;
pub(super) mod repositories;
use config::RestClientConfig;
use lnm::{
account::LnmAccountRepository, futures_cross::LnmFuturesCrossRepository,
futures_data::LnmFuturesDataRepository, futures_isolated::LnmFuturesIsolatedRepository,
oracle::LnmOracleRepository, signature::SignatureGeneratorV3,
utilities::LnmUtilitiesRepository,
};
use repositories::{
AccountRepository, FuturesCrossRepository, FuturesDataRepository, FuturesIsolatedRepository,
OracleRepository, UtilitiesRepository,
};
pub struct RestClient {
pub has_credentials: bool,
pub utilities: Box<dyn UtilitiesRepository>,
pub futures_isolated: Box<dyn FuturesIsolatedRepository>,
pub futures_cross: Box<dyn FuturesCrossRepository>,
pub futures_data: Box<dyn FuturesDataRepository>,
pub account: Box<dyn AccountRepository>,
pub oracle: Box<dyn OracleRepository>,
}
impl RestClient {
fn new_inner(base: Arc<LnmRestBase<SignatureGeneratorV3>>) -> Arc<Self> {
let has_credentials = base.has_credentials();
let utilities = Box::new(LnmUtilitiesRepository::new(base.clone()));
let futures_isolated = Box::new(LnmFuturesIsolatedRepository::new(base.clone()));
let futures_cross = Box::new(LnmFuturesCrossRepository::new(base.clone()));
let futures_data = Box::new(LnmFuturesDataRepository::new(base.clone()));
let account = Box::new(LnmAccountRepository::new(base.clone()));
let oracle = Box::new(LnmOracleRepository::new(base));
Arc::new(Self {
has_credentials,
utilities,
futures_isolated,
futures_cross,
futures_data,
account,
oracle,
})
}
pub fn new(config: impl Into<RestClientConfig>, domain: impl ToString) -> Result<Arc<Self>> {
let config = config.into();
let rate_limiter = config
.rate_limiter_active()
.then(|| RateLimiter::from(&config));
let base = LnmRestBase::new(config.timeout(), domain.to_string(), rate_limiter)?;
Ok(Self::new_inner(base))
}
pub fn with_credentials(
config: impl Into<RestClientConfig>,
domain: impl ToString,
key: impl ToString,
secret: impl ToString,
passphrase: impl ToString,
) -> Result<Arc<Self>> {
let config = config.into();
let rate_limiter = config
.rate_limiter_active()
.then(|| RateLimiter::from(&config));
let base = LnmRestBase::with_credentials(
config.timeout(),
domain.to_string(),
key.to_string(),
passphrase.to_string(),
SignatureGeneratorV3::new(secret.to_string()),
rate_limiter,
)?;
Ok(Self::new_inner(base))
}
}