use super::super::{
super::{data::*, errors::*, plugins::*, store::*},
property::*,
};
use kutil::std::error::*;
impl Property {
pub fn prepare<StoreT, ErrorReceiverT>(
&mut self,
id: &ID,
property_name: &str,
library: &mut Library<StoreT>,
errors: &mut ErrorReceiverT,
) -> Result<bool, FloriaError>
where
StoreT: Clone + Send + Store,
ErrorReceiverT: ErrorReceiver<FloriaError>,
{
if self.value.is_none() {
return Ok(false);
}
if let Some(preparer) = &self.preparer {
let call_site = CallSite::new(id.clone(), Some(property_name.into()));
if let Some(expression) = preparer.clone().evaluate(&call_site, library, errors)? {
self.value = Some(expression.into());
}
return Ok(true);
}
Ok(false)
}
pub fn update<StoreT, ErrorReceiverT>(
&mut self,
id: &ID,
property_name: &str,
library: &mut Library<StoreT>,
errors: &mut ErrorReceiverT,
) -> Result<bool, FloriaError>
where
StoreT: Clone + Send + Store,
ErrorReceiverT: ErrorReceiver<FloriaError>,
{
if self.read_only && self.value.is_some() {
return Ok(false);
}
if let Some(updater) = &self.updater {
let call_site = CallSite::new(id.clone(), Some(property_name.into()));
if let Some(expression) = updater.clone().evaluate(&call_site, library, errors)? {
self.value = Some(expression.into());
}
return Ok(true);
}
Ok(false)
}
}