greed 0.5.2

A rust tool to automate trades 📈
Documentation
use crate::config::quote_fetcher_config::QuoteFetcherConfig;
use crate::config::tactic::median::MedianPeriod;
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(untagged)]
pub enum WhenConfig {
    AllOf {
        all_off: Vec<WhenConfig>,
    },
    Always {
        always: bool,
    },
    BelowMedian {
        below_median_percent: f64,
        #[serde(default)]
        median_period: MedianPeriod,
    },
    GainAbove {
        gain_above_percent: f64,
    },
    Never {
        never: bool,
    },
}

impl Default for WhenConfig {
    fn default() -> Self {
        Self::Always { always: true }
    }
}

impl QuoteFetcherConfig for WhenConfig {
    fn should_fetch_quotes(&self) -> bool {
        match self {
            WhenConfig::AllOf { all_off } => {
                all_off.iter().any(|config| config.should_fetch_quotes())
            }
            WhenConfig::Always { .. } => false,
            WhenConfig::BelowMedian { .. } => true,
            WhenConfig::GainAbove { .. } => false,
            WhenConfig::Never { .. } => false,
        }
    }
}

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

    #[test]
    fn default() {
        assert_eq!(WhenConfig::Always { always: true }, Default::default())
    }

    #[test]
    fn should_fetch_quotes_all_of() {
        let all_of = WhenConfig::AllOf {
            all_off: vec![
                WhenConfig::Always { always: true },
                WhenConfig::BelowMedian {
                    below_median_percent: 10.0,
                    median_period: MedianPeriod::default(),
                },
            ],
        };
        assert!(all_of.should_fetch_quotes());
    }

    #[test]
    fn should_fetch_quotes_all_of_without_quotes() {
        let all_of = WhenConfig::AllOf {
            all_off: vec![
                WhenConfig::Always { always: true },
                WhenConfig::GainAbove {
                    gain_above_percent: 10.0,
                },
                WhenConfig::Never { never: true },
            ],
        };
        assert!(!all_of.should_fetch_quotes());
    }

    #[test]
    fn should_fetch_quotes_always() {
        let always = WhenConfig::Always { always: true };
        assert!(!always.should_fetch_quotes());
    }

    #[test]
    fn should_fetch_quotes_below_median() {
        let below_median = WhenConfig::BelowMedian {
            below_median_percent: 10.0,
            median_period: MedianPeriod::default(),
        };
        assert!(below_median.should_fetch_quotes());
    }

    #[test]
    fn should_fetch_quotes_gain_above() {
        let gain_above = WhenConfig::GainAbove {
            gain_above_percent: 10.0,
        };
        assert!(!gain_above.should_fetch_quotes());
    }

    #[test]
    fn should_fetch_quotes_never() {
        let never = WhenConfig::Never { never: true };
        assert!(!never.should_fetch_quotes());
    }
}