stock-trek 0.7.4

Stock Trek time-series analysis
Documentation
use crate::{
    capability::{combine_capabilities, Capability, HasRequiredCapabilities},
    error::result::StockTrekResult,
    predicates::predicate::Predicate,
    resolved_context::ResolvedContext,
    resolvers::resolver::{Resolver, ResolverTrait},
};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
pub struct IfResolver {
    condition: Predicate,
    if_true: Resolver,
    if_false: Resolver,
}

impl IfResolver {
    pub fn new(condition: Predicate, if_true: Resolver, if_false: Resolver) -> Resolver {
        Box::new(Self {
            condition,
            if_true,
            if_false,
        })
    }
}

#[typetag::serde]
impl ResolverTrait for IfResolver {
    fn resolve(&self, c: &ResolvedContext) -> StockTrekResult<()> {
        let predicate = self.condition.test(c)?;
        if predicate {
            self.if_true.resolve(c)?;
        } else {
            self.if_false.resolve(c)?;
        }
        Ok(())
    }
}

impl HasRequiredCapabilities for IfResolver {
    fn required_capabilities(&self) -> Vec<Capability> {
        combine_capabilities(&[self.if_false.as_ref(), self.if_true.as_ref()])
    }
}