use super::{Base, ChannelAxis, Error, NumericAxis};
use crate::{array_cache::UriResolvable, schema::array_uri_reference::AbsoluteUri};
use ndarray::SliceInfoElem;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CompositeAxis {
pub descriptors: Vec<NumericAxis>,
}
impl Base for CompositeAxis {
fn size(&self) -> Result<usize, Error> {
if self.descriptors.is_empty() {
Err("Empty CompositeAxis.descriptors".into())
} else {
self.descriptors[0].size()
}
}
fn slice(&self, slice_info: &SliceInfoElem) -> Result<ChannelAxis, Error> {
let mut sliced = Vec::<NumericAxis>::with_capacity(self.descriptors.len());
for axis in &self.descriptors {
sliced.push(axis.slice(slice_info)?.try_into()?);
}
Ok(Self {
descriptors: sliced,
}
.into())
}
}
impl UriResolvable for CompositeAxis {
fn set_base_for_relative_uris(&mut self, base_uri: &AbsoluteUri) {
for component in &mut self.descriptors {
component.set_base_for_relative_uris(base_uri);
}
}
}