use super::{
ambassador_impl_Base, Base, ChannelAxis, CoordinateAxis, Error, LabelledAxis, LinearAxis,
LogarithmicAxis, NumericAxis,
};
use crate::{array_cache::UriResolvable, schema::array_uri_reference::AbsoluteUri};
use ambassador::Delegate;
use derive_more::From;
use ndarray::SliceInfoElem;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Delegate, From, Deserialize, Serialize)]
#[delegate(Base)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum TileAxis {
Linear(LinearAxis),
Logarithmic(LogarithmicAxis),
Labelled(LabelledAxis),
Coordinate(CoordinateAxis),
}
impl From<NumericAxis> for TileAxis {
fn from(numeric: NumericAxis) -> Self {
match numeric {
NumericAxis::Linear(axis) => axis.into(),
NumericAxis::Logarithmic(axis) => axis.into(),
NumericAxis::Coordinate(axis) => axis.into(),
}
}
}
impl TryFrom<ChannelAxis> for TileAxis {
type Error = Error;
fn try_from(channel_axis: ChannelAxis) -> Result<Self, Self::Error> {
match channel_axis {
ChannelAxis::Linear(axis) => Ok(axis.into()),
ChannelAxis::Logarithmic(axis) => Ok(axis.into()),
ChannelAxis::Coordinate(axis) => Ok(axis.into()),
ChannelAxis::Labelled(axis) => Ok(axis.into()),
ChannelAxis::Composite(_) => Err("TileAxis does not support Composite variant".into()),
}
}
}
impl UriResolvable for TileAxis {
fn set_base_for_relative_uris(&mut self, base_uri: &AbsoluteUri) {
if let Self::Coordinate(axis) = self {
axis.set_base_for_relative_uris(base_uri)
}
}
}