use crate::error::Result;
use crate::generated::PropertyObject;
use crate::object::BaseObject;
#[must_use = "dropping the guard immediately would commit the batch at once"]
pub struct BatchedPropertyUpdate {
objects: Vec<PropertyObject>,
}
impl BatchedPropertyUpdate {
pub fn new(objects: &[&PropertyObject]) -> Result<BatchedPropertyUpdate> {
let mut opened: Vec<PropertyObject> = Vec::with_capacity(objects.len());
for object in objects {
if let Err(e) = object.begin_update() {
for open in opened.iter().rev() {
let _ = open.end_update();
}
return Err(e);
}
opened.push((*object).clone());
}
Ok(BatchedPropertyUpdate { objects: opened })
}
pub fn commit(mut self) -> Result<()> {
let objects = std::mem::take(&mut self.objects);
std::mem::forget(self);
for object in objects.iter().rev() {
object.end_update()?;
}
Ok(())
}
}
impl Drop for BatchedPropertyUpdate {
fn drop(&mut self) {
for object in self.objects.iter().rev() {
let _ = object.end_update();
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ComponentKind {
Channel,
FunctionBlock,
Device,
Signal,
InputPort,
Folder,
Component,
}
impl BaseObject {
pub fn component_kind(&self) -> Option<ComponentKind> {
if self.is_a::<crate::Channel>() {
Some(ComponentKind::Channel)
} else if self.is_a::<crate::FunctionBlock>() {
Some(ComponentKind::FunctionBlock)
} else if self.is_a::<crate::Device>() {
Some(ComponentKind::Device)
} else if self.is_a::<crate::Signal>() {
Some(ComponentKind::Signal)
} else if self.is_a::<crate::InputPort>() {
Some(ComponentKind::InputPort)
} else if self.is_a::<crate::Folder>() {
Some(ComponentKind::Folder)
} else if self.is_a::<crate::Component>() {
Some(ComponentKind::Component)
} else {
None
}
}
}