use rgb::{GraphSeal, OpId, Operation, Transition, TransitionBundle};
use crate::accessors::TypedAssignsExt;
#[derive(Copy, Clone, Eq, PartialEq, Debug, Display, Error)]
#[display(doc_comments)]
pub enum RevealError {
UnrelatedTransition(OpId),
}
pub trait BundleExt {
fn reveal_seal(&mut self, seal: GraphSeal);
fn reveal_transition(&mut self, transition: &Transition) -> Result<bool, RevealError>;
}
impl BundleExt for TransitionBundle {
fn reveal_seal(&mut self, seal: GraphSeal) {
for (_, item) in self.keyed_values_mut() {
if let Some(transition) = &mut item.transition {
for (_, assign) in transition.assignments.keyed_values_mut() {
assign.reveal_seal(seal)
}
}
}
}
fn reveal_transition(&mut self, transition: &Transition) -> Result<bool, RevealError> {
let id = transition.id();
let item = self
.get_mut(&id)
.ok_or(RevealError::UnrelatedTransition(id))?;
match item.transition {
None => {
item.transition = Some(transition.clone());
Ok(true)
}
Some(_) => Ok(false),
}
}
}