use super::{utils::slice_array, Base, ChannelAxis, Error, TileAxis};
use crate::schema::Label;
use ndarray::SliceInfoElem;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LabelledAxis {
pub labels: Vec<Label>,
}
impl Base for LabelledAxis {
fn size(&self) -> Result<usize, Error> {
Ok(self.labels.len())
}
fn slice(&self, slice_info: &SliceInfoElem) -> Result<ChannelAxis, Error> {
let sliced = slice_array(&self.labels, slice_info)?.to_vec();
if sliced.is_empty() {
Err("LabelledAxis cannot be empty".into())
} else {
Ok(Self { labels: sliced }.into())
}
}
}
impl TryFrom<TileAxis> for LabelledAxis {
type Error = Error;
fn try_from(tile_axis: TileAxis) -> Result<Self, Self::Error> {
match tile_axis {
TileAxis::Labelled(labelled) => Ok(labelled),
_ => Err("Logic error: TileAxis does not hold a Labelled variant".into()),
}
}
}
impl TryFrom<ChannelAxis> for LabelledAxis {
type Error = Error;
fn try_from(tile_axis: ChannelAxis) -> Result<Self, Self::Error> {
match tile_axis {
ChannelAxis::Labelled(labelled) => Ok(labelled),
_ => Err("Logic error: ChannelAxis does not hold a Labelled variant".into()),
}
}
}