use crate::{
node::{Node, NodeId},
object::Object,
};
use serde::{Deserialize, Serialize};
use std::{error::Error, fmt::Debug, rc::Rc};
type ObjFromStrFn = fn(&str) -> Result<Rc<dyn Object>, Box<dyn Error + Send + Sync>>;
#[derive(Clone)]
pub struct Class {
pub name: String,
pub nodes: Vec<Rc<dyn Node>>,
pub obj_from_str: Option<ObjFromStrFn>,
}
impl PartialEq for Class {
fn eq(&self, other: &Self) -> bool {
self.name.eq(&other.name)
}
}
impl Eq for Class {}
impl Debug for Class {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Class")
.field("name", &self.name)
.field("node", &self.nodes)
.finish()
}
}
impl Serialize for Class {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.name.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for Class {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let name = String::deserialize(deserializer)?;
Ok(Self {
name,
nodes: vec![],
obj_from_str: None,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProtoClass {
pub name: String,
pub nodes: Vec<NodeId>,
}