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};
pub trait Source<T: Send> {
fn collect(&self, brewery: &Brewery, recipe: Arc<RwLock<Vec<Box<dyn Ingredient<T> + Send + Sync>>>>);
fn as_any(&self) -> &dyn Any;
fn print(&self);
fn get_name(&self) -> &str;
fn get_source(&self) -> &str;
}
impl<T: Send + 'static> Source<T> for Fill<T> {
fn collect(&self, brewery: &Brewery, recipe: Arc<RwLock<Vec<Box<dyn Ingredient<T> + 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
}
}