use alloc::rc::Rc;
use core::fmt::Display;
use crate::{
shared::StyleClass,
traits::{Configuration, DiagramBuilder, Edge, Node},
};
pub trait Diagram {
type Builder: DiagramBuilder<Diagram = Self, Node = Self::Node, Edge = Self::Edge>;
type Node: Node + Display;
type Edge: Edge<Node = Self::Node> + Display;
type Configuration: Configuration + Display;
fn configuration(&self) -> &Self::Configuration;
fn nodes(&self) -> impl Iterator<Item = &Self::Node>;
fn edges(&self) -> impl Iterator<Item = &Self::Edge>;
fn style_classes(&self) -> impl Iterator<Item = &StyleClass>;
fn get_node_by_id(&self, id: u64) -> Option<Rc<Self::Node>>;
fn get_style_class_by_name(&self, name: &str) -> Option<Rc<StyleClass>>;
}