use std::any::Any;
use fiftyone_pipeline_core::{ElementData, NoValueError, PropertyValue, TypedKey};
use crate::constants::{JAVASCRIPT_BUILDER_ELEMENT_DATA_KEY, JAVASCRIPT_PROPERTY_KEY};
pub const JAVASCRIPT_BUILDER_DATA_KEY: TypedKey<JavaScriptBuilderElementData> =
TypedKey::new(JAVASCRIPT_BUILDER_ELEMENT_DATA_KEY);
#[derive(Debug, Clone, Default)]
pub struct JavaScriptBuilderElementData {
javascript: String,
}
impl JavaScriptBuilderElementData {
pub fn new() -> Self {
JavaScriptBuilderElementData {
javascript: String::new(),
}
}
pub fn javascript(&self) -> &str {
&self.javascript
}
pub fn set_javascript(&mut self, javascript: impl Into<String>) {
self.javascript = javascript.into();
}
}
impl ElementData for JavaScriptBuilderElementData {
fn get(&self, name: &str) -> Result<PropertyValue, NoValueError> {
if name.eq_ignore_ascii_case(JAVASCRIPT_PROPERTY_KEY) {
Ok(PropertyValue::String(self.javascript.clone()))
} else {
Err(NoValueError::new(format!(
"No value for property '{name}'."
)))
}
}
fn keys(&self) -> Vec<String> {
vec![JAVASCRIPT_PROPERTY_KEY.to_owned()]
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}