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
}
}