1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::ingredient::{Fill, Ingredient};
use crate::brewery::Brewery;

use std::any::Any;
use std::sync::{Arc, RwLock};

///
/// Trait given to Box elements added to Pot for pulling in raw data.
pub trait Source {
    ///
    /// Runs the Fill computation to collect Tea in batches and send to the Brewery for processing.
    ///
    /// # Arguments
    ///
    /// * `brewery` - Brewery that sends job to process Tea
    /// * `recipe` - clone of recipe to pass to Brewery
    fn collect(&self, brewery: &Brewery, recipe: Arc<RwLock<Vec<Box<dyn Ingredient + Send + Sync>>>>);

    ///
    /// Used to convert Box<dyn Ingredient> to Any to unwrap Ingredient. 
    fn as_any(&self) -> &dyn Any;

    ///
    /// Print out current step information.
    fn print(&self);

    ///
    /// Returns name given to Ingredient.
    fn get_name(&self) -> &str;

    ///
    /// Returns source given to Ingredient.
    fn get_source(&self) -> &str;
}

impl Source for Fill {
    fn collect(&self, brewery: &Brewery, recipe: Arc<RwLock<Vec<Box<dyn Ingredient + Send + Sync>>>>) {
        (self.computation)(self.get_params(), brewery, recipe)
    }
    fn get_name(&self) -> &str {
        &self.name[..]
    }
    fn get_source(&self) -> &str {
        &self.source[..]
    }
    fn print(&self) {
        println!("Current Source: {}", self.get_name());
    }
    fn as_any(&self) -> &dyn Any {
        self
    }
}