stock-trek 0.4.13

Stock Trek time-series analysis
Documentation
use crate::{
    actions::action::{Action, ActionTrait},
    error::{
        result::{StockTrekError, StockTrekResult},
        value::ValueError,
    },
    exchanges::exchange::Exchange,
};
use digdigdig3::{core::OrderRequest, ExchangeId};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Clone, Serialize, Deserialize)]
pub struct OrderRequestAction {
    exchange: ExchangeId,
    order_request: OrderRequest,
}

impl OrderRequestAction {
    pub fn new(exchange: ExchangeId, order_request: OrderRequest) -> Action {
        Box::new(Self {
            exchange,
            order_request,
        })
    }
}

#[typetag::serde]
impl ActionTrait for OrderRequestAction {
    fn clone_box(&self) -> Box<dyn ActionTrait> {
        Box::new(self.clone())
    }
    fn complete(
        &self,
        bot_id: &str,
        exchanges: &HashMap<ExchangeId, Exchange>,
    ) -> StockTrekResult<()> {
        if let Some(exchange) = exchanges.get(&self.exchange) {
            let order = exchange.place_order(bot_id, &self.order_request)?;
            println!("{:?}", order);
            Ok(())
        } else {
            Err(StockTrekError::Value(ValueError::NotFound {
                name: "Exchange".to_string(),
                key: self.exchange.as_str().to_string(),
            }))
        }
    }
}