greed 0.5.2

A rust tool to automate trades 📈
Documentation
use crate::config::strategy::StrategyConfig;
use crate::config::Config;
use crate::error::GreedError;
use crate::platform::FinancialPlatform;
use crate::strategy::provider::config_provider::ConfigStrategyProvider;
use crate::strategy::provider::StrategyRunnerProvider;
use std::path::PathBuf;
use std::sync::Arc;
use std::time::Duration;

pub struct StrategyProviderFactory<'a> {
    config: &'a Config,
    config_path: PathBuf,
    platform: &'a Arc<dyn FinancialPlatform>,
}

impl<'a> StrategyProviderFactory<'a> {
    pub fn new(
        config: &'a Config,
        config_path: PathBuf,
        platform: &'a Arc<dyn FinancialPlatform>,
    ) -> StrategyProviderFactory<'a> {
        Self {
            config,
            config_path,
            platform,
        }
    }

    pub async fn create_providers(
        &self,
    ) -> Result<Vec<Box<dyn StrategyRunnerProvider>>, GreedError> {
        let strategy_configs = self.config.strategies.clone();
        let mut providers = Vec::new();
        for strategy_config in strategy_configs {
            let provider = self.provider_for_strategy_config(strategy_config).await?;
            providers.push(provider);
        }
        Ok(providers)
    }

    async fn provider_for_strategy_config(
        &self,
        strategy_config: StrategyConfig,
    ) -> Result<Box<dyn StrategyRunnerProvider>, GreedError> {
        match strategy_config {
            StrategyConfig::LocalFile { .. } => {
                let provider = ConfigStrategyProvider::new(
                    self.config_path.clone(),
                    Duration::from_secs(self.config.interval),
                    self.platform.clone(),
                    strategy_config,
                )
                .await?;
                Ok(Box::new(provider))
            }
        }
    }
}