use serde::{Deserialize, Serialize};
use crate::Result;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct ReferenceBuses(Vec<usize>);
impl ReferenceBuses {
#[must_use]
pub fn new(buses: Vec<usize>) -> Self {
Self(buses)
}
pub fn iter(&self) -> std::slice::Iter<'_, usize> {
self.0.iter()
}
#[must_use]
pub fn len(&self) -> usize {
self.0.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn single(&self) -> Result<usize> {
match self.0.as_slice() {
[bus] => Ok(*bus),
other => Err(powerio::Error::reference_bus_count(other.len()).into()),
}
}
}
impl AsRef<[usize]> for ReferenceBuses {
fn as_ref(&self) -> &[usize] {
&self.0
}
}
impl<'a> IntoIterator for &'a ReferenceBuses {
type Item = &'a usize;
type IntoIter = std::slice::Iter<'a, usize>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}