use cotis::element_configuring::{
ConfigureElements, ConfigureLeafElements, ConfiguredParentElement, OpenElement,
};
use serde::Serialize;
use crate::serialize_targets::LeafedInterfaceDeclaration;
pub struct DebugInitialConfiguredParentElement<
'b,
'element,
Configurer: ConfigureElements<ConfigType>,
ConfigType: Clone + Serialize,
List: Copy,
> {
internal: &'b mut ConfiguredParentElement<'element, Configurer, ConfigType>,
interface_recorder: &'b mut LeafedInterfaceDeclaration<ConfigType, List>,
}
impl<
'b,
'element,
Configurer: ConfigureElements<ConfigType>,
ConfigType: Clone + Serialize,
List: Copy,
> DebugInitialConfiguredParentElement<'b, 'element, Configurer, ConfigType, List>
{
pub fn new(
internal: &'b mut ConfiguredParentElement<'element, Configurer, ConfigType>,
interface_recorder: &'b mut LeafedInterfaceDeclaration<ConfigType, List>,
) -> Self {
Self {
internal,
interface_recorder,
}
}
pub fn new_element(&'_ mut self) -> DebugOpenElement<'_, Configurer, ConfigType, List>
where
Self: Sized,
{
self.interface_recorder.open();
let new_element = self.internal.new_element();
DebugOpenElement {
internal: Some(new_element),
interface_recorder: Some(&mut self.interface_recorder),
}
}
pub fn close_element(self) {
self.interface_recorder.close();
}
}
pub struct DebugConfiguredParentElement<
'element,
Configurer: ConfigureElements<ConfigType>,
ConfigType: Clone + Serialize,
List: Copy,
> {
internal: ConfiguredParentElement<'element, Configurer, ConfigType>,
interface_recorder: &'element mut LeafedInterfaceDeclaration<ConfigType, List>,
}
impl<'element, Configurer: ConfigureElements<ConfigType>, ConfigType: Clone + Serialize, List: Copy>
DebugConfiguredParentElement<'element, Configurer, ConfigType, List>
{
pub fn new(
internal: ConfiguredParentElement<'element, Configurer, ConfigType>,
interface_recorder: &'element mut LeafedInterfaceDeclaration<ConfigType, List>,
) -> Self {
Self {
internal,
interface_recorder,
}
}
pub fn new_element(&'_ mut self) -> DebugOpenElement<'_, Configurer, ConfigType, List>
where
Self: Sized,
{
self.interface_recorder.open();
let new_element = self.internal.new_element();
DebugOpenElement {
internal: Some(new_element),
interface_recorder: Some(&mut self.interface_recorder),
}
}
pub fn close_element(self) {
drop(self)
}
}
pub struct DebugOpenElement<
'element,
Configurer: ConfigureElements<ConfigType>,
ConfigType: Clone + Serialize,
List: Copy,
> {
internal: Option<OpenElement<'element, Configurer, ConfigType>>,
interface_recorder: Option<&'element mut LeafedInterfaceDeclaration<ConfigType, List>>,
}
impl<'element, ConfigType: Clone + Serialize, Configurer: ConfigureElements<ConfigType>, List: Copy>
DebugOpenElement<'element, Configurer, ConfigType, List>
{
pub fn set_config(&mut self, config: ConfigType) {
self.interface_recorder
.as_mut()
.unwrap()
.add_config(config.clone());
self.internal.as_mut().unwrap().set_config(config);
}
pub fn make_parent(
mut self,
) -> DebugConfiguredParentElement<'element, Configurer, ConfigType, List> {
DebugConfiguredParentElement {
internal: self.internal.take().unwrap().make_parent(),
interface_recorder: self.interface_recorder.take().unwrap(),
}
}
pub fn close_element(self) {
drop(self)
}
pub fn set_leaf_config<LeafConfig>(mut self, config: LeafConfig)
where
Configurer: ConfigureLeafElements<LeafConfig>,
LeafConfig: Serialize,
{
self.interface_recorder
.as_mut()
.unwrap()
.add_leaf_config(&config);
self.internal.take().unwrap().set_leaf_config(config);
}
}
impl<'element, Configurer: ConfigureElements<ConfigType>, ConfigType: Clone + Serialize, List: Copy>
Drop for DebugOpenElement<'element, Configurer, ConfigType, List>
{
fn drop(&mut self) {
match &mut self.interface_recorder {
None => {}
Some(recorder) => {
recorder.close();
}
}
}
}
impl<'element, ConfigType: Clone + Serialize, Configurer: ConfigureElements<ConfigType>, List: Copy>
Drop for DebugConfiguredParentElement<'element, Configurer, ConfigType, List>
{
fn drop(&mut self) {
self.interface_recorder.close();
}
}