use alloc::boxed::Box;
use core::any::Any;
use crate::error::NodeError;
use crate::kv::KvPairs;
use crate::param::{ParamMap, ParamValue};
use crate::schema::NodeSchema;
pub trait NodeDef: Send + Sync + 'static {
fn schema(&self) -> &'static NodeSchema;
fn create(&self, params: &ParamMap) -> Result<Box<dyn NodeInstance>, NodeError>;
#[allow(clippy::wrong_self_convention)]
fn from_kv(&self, kv: &mut KvPairs) -> Result<Option<Box<dyn NodeInstance>>, NodeError>;
fn create_default(&self) -> Result<Box<dyn NodeInstance>, NodeError> {
self.create(&ParamMap::new())
}
}
pub trait NodeInstance: Send + Sync + Any {
fn schema(&self) -> &'static NodeSchema;
fn to_params(&self) -> ParamMap;
fn get_param(&self, name: &str) -> Option<ParamValue>;
fn set_param(&mut self, name: &str, value: ParamValue) -> bool;
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn clone_boxed(&self) -> Box<dyn NodeInstance>;
fn is_identity(&self) -> bool {
false
}
}