boreholeio 0.1.0

A library for interacting with borehole.io, a subsurface data management, delivery and visualisation platform
Documentation
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())
        }
    }
}

/// `TileAxis` to `LabelledAxis` conversion.
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()),
        }
    }
}

/// `ChannelAxis` to `LabelledAxis` conversion.
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()),
        }
    }
}