use crate::{
element::BPMNElement,
parser::parser_state::GlobalIndex,
sequence_flow::BPMNSequenceFlow,
traits::{objectable::BPMNObject, processable::Processable},
};
pub(crate) trait Searchable {
fn id_2_pool_and_global_index(&self, id: &str) -> Option<(Option<usize>, GlobalIndex)>;
fn id_2_local_index(&self, id: &str) -> Option<usize>;
fn global_index_2_sequence_flow_and_parent(
&self,
sequence_flow_global_index: GlobalIndex,
) -> Option<(&BPMNSequenceFlow, &dyn Processable)>;
fn all_elements_ref(&self) -> Vec<&BPMNElement>;
fn parent_of(&self, global_index: GlobalIndex) -> (Option<&dyn Processable>, bool);
fn all_sequence_flows_ref(&self) -> Vec<&BPMNSequenceFlow>;
fn global_index_2_sequence_flow_mut(
&mut self,
sequence_flow_global_index: GlobalIndex,
) -> Option<&mut BPMNSequenceFlow>;
fn global_index_2_element(&self, index: GlobalIndex) -> Option<&BPMNElement>;
fn global_index_2_element_mut(&mut self, index: GlobalIndex) -> Option<&mut BPMNElement>;
fn local_index_2_element(&self, index: usize) -> Option<&BPMNElement>;
fn local_index_2_element_mut(&mut self, index: usize) -> Option<&mut BPMNElement>;
}
impl Searchable for Vec<BPMNElement> {
fn id_2_pool_and_global_index(&self, id: &str) -> Option<(Option<usize>, GlobalIndex)> {
for element in self {
let x = element.id_2_pool_and_global_index(id);
if x.is_some() {
return x;
}
}
None
}
fn id_2_local_index(&self, id: &str) -> Option<usize> {
for element in self {
if element.id() == id {
return Some(element.local_index());
}
}
None
}
fn global_index_2_sequence_flow_and_parent(
&self,
sequence_flow_global_index: GlobalIndex,
) -> Option<(&BPMNSequenceFlow, &dyn Processable)> {
for element in self {
let x = element.global_index_2_sequence_flow_and_parent(sequence_flow_global_index);
if x.is_some() {
return x;
}
}
None
}
fn all_elements_ref(&self) -> Vec<&BPMNElement> {
self.iter()
.map(|element| element.all_elements_ref())
.flatten()
.collect()
}
fn parent_of(&self, global_index: GlobalIndex) -> (Option<&dyn Processable>, bool) {
for element in self {
let x = element.parent_of(global_index);
if x.1 {
return x;
}
}
(None, false)
}
fn all_sequence_flows_ref(&self) -> Vec<&BPMNSequenceFlow> {
self.iter()
.map(|element| element.all_sequence_flows_ref())
.flatten()
.collect()
}
fn global_index_2_sequence_flow_mut(
&mut self,
sequence_flow_global_index: GlobalIndex,
) -> Option<&mut BPMNSequenceFlow> {
self.iter_mut()
.filter_map(|element| {
element.global_index_2_sequence_flow_mut(sequence_flow_global_index)
})
.next()
}
fn global_index_2_element(&self, index: GlobalIndex) -> Option<&BPMNElement> {
self.iter()
.filter_map(|element| element.global_index_2_element(index))
.next()
}
fn global_index_2_element_mut(&mut self, index: GlobalIndex) -> Option<&mut BPMNElement> {
self.iter_mut()
.filter_map(|element| element.global_index_2_element_mut(index))
.next()
}
fn local_index_2_element(&self, index: usize) -> Option<&BPMNElement> {
self.get(index)
}
fn local_index_2_element_mut(&mut self, index: usize) -> Option<&mut BPMNElement> {
self.get_mut(index)
}
}