greed 0.5.2

A rust tool to automate trades 📈
Documentation
use crate::asset::AssetSymbol;
use crate::tactic::r#for::{ForResult, ForRule};
use crate::tactic::state::TacticState;
use crate::tactic::target::TargetAsset;

#[derive(Debug, Default, PartialEq)]
pub struct ForStockRule {
    pub stock: AssetSymbol,
}

impl ForRule for ForStockRule {
    fn evaluate(&self, _state: &TacticState) -> ForResult {
        let target = TargetAsset::full_percent(self.stock.clone());
        ForResult {
            target_assets: vec![target],
        }
    }
}

impl ForStockRule {
    pub fn boxed<T: Into<AssetSymbol>>(stock: T) -> Box<dyn ForRule> {
        Box::new(Self {
            stock: stock.into(),
        })
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn evaluate() {
        let state: TacticState = Default::default();
        let rule = ForStockRule::boxed("SPY");
        let result = rule.evaluate(&state);
        let expected = ForResult {
            target_assets: vec![TargetAsset::full_percent(AssetSymbol::new("SPY"))],
        };
        assert_eq!(expected, result)
    }
}