boreholeio 0.1.0

A library for interacting with borehole.io, a subsurface data management, delivery and visualisation platform
Documentation
use super::{
    ambassador_impl_Base, ambassador_impl_Numeric, Base, ChannelAxis, CoordinateAxis, Error,
    InterpolationType, LinearAxis, LogarithmicAxis, Monotonicity, Numeric, TileAxis,
};
use crate::{array_cache::UriResolvable, schema::array_uri_reference::AbsoluteUri};
use ambassador::Delegate;
use derive_more::From;
use ndarray::{Array1, SliceInfoElem};
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Delegate, From, Deserialize, Serialize)]
#[delegate(Base)]
#[delegate(Numeric)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum NumericAxis {
    Linear(LinearAxis),
    Logarithmic(LogarithmicAxis),
    Coordinate(CoordinateAxis),
}

/// `TileAxis` to `NumericAxis` conversion.
impl TryFrom<TileAxis> for NumericAxis {
    type Error = Error;

    fn try_from(tile_axis: TileAxis) -> Result<Self, Self::Error> {
        match tile_axis {
            TileAxis::Linear(linear) => Ok(linear.into()),
            TileAxis::Logarithmic(logarithmic) => Ok(logarithmic.into()),
            TileAxis::Coordinate(coordinate) => Ok(coordinate.into()),
            TileAxis::Labelled(_) => {
                Err("Logic error: TileAxis does not hold a numeric variant".into())
            }
        }
    }
}

/// `TileAxis` to `NumericAxis` conversion.
impl TryFrom<ChannelAxis> for NumericAxis {
    type Error = Error;

    fn try_from(channel_axis: ChannelAxis) -> Result<Self, Self::Error> {
        match channel_axis {
            ChannelAxis::Linear(linear) => Ok(linear.into()),
            ChannelAxis::Logarithmic(logarithmic) => Ok(logarithmic.into()),
            ChannelAxis::Coordinate(coordinate) => Ok(coordinate.into()),
            _ => Err("Logic error: ChannelAxis does not hold a numeric variant".into()),
        }
    }
}

impl UriResolvable for NumericAxis {
    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)
        }
    }
}