use alloc::{string::String, vec::Vec};
use core::ops::{Deref, DerefMut};
use crate::ConstString;
use super::{PortDefinition, error::Error};
#[derive(Clone, Debug, Default)]
#[repr(transparent)]
pub struct PortList(pub Vec<PortDefinition>);
impl Deref for PortList {
type Target = Vec<PortDefinition>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for PortList {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl PortList {
pub fn add(&mut self, port_definition: PortDefinition) -> Result<(), Error> {
for entry in &self.0 {
if entry.name() == port_definition.name() {
return Err(Error::AlreadyInPortList {
key: entry.name().into(),
});
}
}
self.0.push(port_definition);
Ok(())
}
#[must_use]
pub fn entries(&self) -> ConstString {
let mut result = String::new();
for entry in &self.0 {
if !result.is_empty() {
result += ", ";
}
result += entry.name();
}
result.into()
}
#[must_use]
pub fn find(&self, name: &str) -> Option<PortDefinition> {
for entry in &self.0 {
if entry.name() == name {
return Some(entry.clone());
}
}
None
}
}