pub mod build;
pub mod partial;
pub mod clone;
use crate::{ Block, Layout };
#[derive(Debug, Default, Clone)]
pub struct Layer<B: Block> {
pub(crate) layout: Layout,
pub(crate) blocks: Vec<B>
}
impl<B: Block> Layer<B> {
pub fn new() -> Self {
Self::default()
}
pub fn blocks(&self) -> &Vec<B> {
&self.blocks
}
pub(crate) fn blocks_mut(&mut self) -> &mut Vec<B> {
&mut self.blocks
}
pub fn layout(&self) -> &Layout {
&self.layout
}
pub(crate) fn layout_mut(&mut self) -> &mut Layout {
&mut self.layout
}
pub fn set_from_layout(
&mut self,
layout: Layout,
blocks: Vec<B>
) -> anyhow::Result<()> {
if layout.total() != blocks.len() {
return Err(anyhow::anyhow!("Size mismatch"))
}
*self.layout_mut() = layout;
*self.blocks_mut() = blocks;
Ok(())
}
pub fn map<C: Block, T: Fn(&B) -> C>(&self, t: T) -> Layer<C> {
let mapped_blocks: Vec<C> = self.blocks()
.iter()
.map(t)
.collect();
let mut mapped_layer = Layer::<C>::new();
mapped_layer.layout = self.layout.clone();
mapped_layer.blocks = mapped_blocks;
mapped_layer
}
}
#[cfg(test)] pub(crate) mod test {
use super::*;
use crate::{ layout, Layout };
use crate::block::{ Block, test::TestBlock };
pub(crate) fn test_layer() -> Layer<TestBlock> {
let mut layer = Layer::<TestBlock>::new();
let layout = layout![1, 2];
let mut blocks = vec![TestBlock::create(&"test".to_string()); 3];
for (b, block) in blocks.iter_mut().enumerate() {
block.id = b.to_string()
}
layer.set_from_layout(layout, blocks)
.expect("Set layer successful");
layer
}
#[test] fn new_layer_test() {
let layer = Layer::<TestBlock>::new();
let layout = layer.layout();
let blocks = layer.blocks();
assert!(layout.is_empty() && blocks.is_empty(), "Default layer is empty");
}
#[test] fn set_layer_test() {
test_layer();
}
#[test] #[should_panic(expected = "Set layer fails")] fn bad_set_layer_test() {
let mut layer = Layer::<TestBlock>::new();
let layout = layout![1, 2];
let blocks = vec![TestBlock::create(&"test".to_string()); 2];
layer.set_from_layout(layout, blocks)
.expect("Set layer fails");
}
}