use std::collections::HashMap;
use crate::{
ValidationError,
builder::{SelectionKind, SelectionView},
dsl::ir::Value,
node::LegatoNode,
nodes::audio::oversample::Oversampler2X,
};
pub struct PipeRegistry {
data: HashMap<String, Box<dyn Pipe>>,
}
impl PipeRegistry {
pub fn new(data: HashMap<String, Box<dyn Pipe>>) -> Self {
Self { data }
}
pub fn insert(&mut self, name: String, pipe: Box<dyn Pipe>) {
self.data.insert(name, pipe);
}
pub fn get(&self, name: &str) -> Result<&dyn Pipe, ValidationError> {
self.data
.get(name)
.map(|x| &**x)
.ok_or(ValidationError::PipeNotFound(format!(
"Could not find pipe {}",
name
)))
}
}
impl Default for PipeRegistry {
fn default() -> Self {
let mut data: HashMap<String, Box<dyn Pipe>> = HashMap::new();
data.insert(String::from("replicate"), Box::new(Replicate {}));
data.insert(String::from("oversample2X"), Box::new(Oversample2X {}));
Self { data }
}
}
pub trait Pipe {
fn pipe(&self, view: &mut SelectionView, props: Option<Value>);
}
struct Replicate;
impl Pipe for Replicate {
fn pipe(&self, view: &mut SelectionView, props: Option<Value>) {
let selection = view.selection();
match selection {
SelectionKind::Single(key) => {
let val = props.unwrap_or(Value::U32(2));
match val {
Value::U32(n) => {
let node = view
.get_node(key)
.expect("Could not find not key in Pipe!")
.clone();
for _ in 0..n {
let cloned = node.clone();
view.insert(cloned);
}
}
_ => panic!("Must provide U32 value for replicate pipe!"),
}
}
SelectionKind::Multiple(_) => {
panic!("Multiple selection kind not supported for replicate")
}
};
}
}
struct Oversample2X;
impl Pipe for Oversample2X {
fn pipe(&self, view: &mut SelectionView, _: Option<Value>) {
let selection = view.selection().clone();
let config = view.config();
match selection {
SelectionKind::Single(key) => {
let node = view.get_node(&key).expect("Could not find key in Pipe!");
let oversampler = Oversampler2X::new(node.clone(), config.block_size);
let new_kind = format!("Oversample2X{}", node.node_kind);
let new_node = LegatoNode::new(node.name.clone(), new_kind, Box::new(oversampler));
view.replace(key, new_node);
}
SelectionKind::Multiple(keys) => {
for key in keys.iter() {
let node = view.get_node(key).expect("Could not find key in Pipe!");
let oversampler = Oversampler2X::new(node.clone(), config.block_size);
let new_kind = format!("Oversample2X{}", node.node_kind);
let new_node =
LegatoNode::new(node.name.clone(), new_kind, Box::new(oversampler));
view.replace(*key, new_node);
}
}
}
}
}