use super::Node;
use super::node_builder::{Builder, NodePrototype};
use crate::components::NodeTransform;
pub struct Container<T> {
item: T,
transform: NodeTransform,
}
impl<T> Container<T> {
pub fn new(item: T) -> Container<T>
where
T: Clone,
{
Container {
item,
transform: NodeTransform::default(),
}
}
pub fn get_item(&self) -> &T {
&self.item
}
pub fn get_item_mut(&mut self) -> &mut T {
&mut self.item
}
pub fn builder(item: T) -> ContainerBuilder<T> {
ContainerBuilder {
item,
prototype: NodePrototype::default(),
}
}
}
impl<T> Node for Container<T>
where
T: Clone + Send + Sync + 'static,
{
fn get_transform(&mut self) -> &mut NodeTransform {
&mut self.transform
}
}
pub struct ContainerBuilder<T> {
item: T,
prototype: NodePrototype,
}
impl<T: Clone + Send + Sync + 'static> Builder for ContainerBuilder<T> {
type Node = Container<T>;
fn prototype(&mut self) -> &mut super::node_builder::NodePrototype {
&mut self.prototype
}
fn build(self) -> Self::Node {
Container {
transform: self.prototype.transform,
item: self.item.clone(),
}
}
}
impl<T> ContainerBuilder<T> {
pub fn item(&mut self, item: T) -> &mut Self {
self.item = item;
self
}
}
#[cfg(test)]
mod test {
use crate::nodes::Container;
#[test]
fn test_container() {
let container = Container::new(13);
assert!(container.item == 13);
}
}