use crate::block::{BasicBlock, BlockProps, Describe, DescribeProps, Test};
pub(crate) trait Inherit {
fn inherit(&mut self, parent_props: &DescribeProps);
}
impl Inherit for Describe {
fn inherit(&mut self, parent_props: &DescribeProps) {
self.properties.block_props.inherit(parent_props);
if let Some(ref parent_props_before) = &parent_props.before {
let before = if let Some(ref self_before) = &self.properties.before {
parent_props_before
.0
.iter()
.chain(self_before.0.iter())
.cloned()
.collect()
} else {
parent_props_before.0.clone()
};
self.properties.before = Some(BasicBlock(before));
}
if let Some(ref parent_props_after) = &parent_props.after {
if let Some(ref mut self_after) = &mut self.properties.after {
self_after.0.extend(parent_props_after.0.clone());
} else {
self.properties.after = Some(parent_props_after.clone());
}
}
}
}
impl Inherit for Test {
fn inherit(&mut self, parent_props: &DescribeProps) {
self.properties.inherit(parent_props);
if let Some(ref parent_props_before) = &parent_props.before {
self.content = BasicBlock(
parent_props_before
.0
.iter()
.chain(self.content.0.iter())
.cloned()
.collect(),
)
}
if let Some(ref parent_props_after) = &parent_props.after {
self.content.0.extend(parent_props_after.0.clone());
}
}
}
impl Inherit for BlockProps {
fn inherit(&mut self, parent_props: &DescribeProps) {
self.attributes
.extend(parent_props.block_props.attributes.clone());
if !self.is_async && parent_props.block_props.is_async {
self.is_async = true;
}
if self.return_type.is_none() {
self.return_type = parent_props.block_props.return_type.clone()
}
}
}