use alloc::vec::Vec;
use crate::error::GraphError;
use crate::id::{NodeId, PortId};
use crate::port::Port;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Node<N> {
id: NodeId,
payload: N,
ports: Vec<Port>,
}
impl<N> Node<N> {
pub fn new(id: NodeId, payload: N, ports: Vec<Port>) -> Self {
Self { id, payload, ports }
}
pub const fn id(&self) -> NodeId {
self.id
}
pub fn payload(&self) -> &N {
&self.payload
}
pub fn payload_mut(&mut self) -> &mut N {
&mut self.payload
}
pub fn ports(&self) -> &[Port] {
self.ports.as_slice()
}
pub fn add_port(&mut self, port: Port) -> Result<(), GraphError> {
if self.ports.iter().any(|existing| existing.id() == port.id()) {
return Err(GraphError::DuplicatePort(port.id().clone()));
}
self.ports.push(port);
Ok(())
}
pub fn port(&self, port_id: &PortId) -> Option<&Port> {
self.ports.iter().find(|port| port.id() == port_id)
}
}