arr-rs 0.6.0

arr-rs - rust arrays library
Documentation
use crate::{
    core::prelude::*,
    errors::prelude::*,
    validators::prelude::*,
};

pub(crate) trait ValidateDimension {

    fn is_dim_supported(&self, supported: &[usize]) -> Result<(), ArrayError>;
    fn is_dim_unsupported(&self, unsupported: &[usize]) -> Result<(), ArrayError>;
}

impl ValidateDimension for usize {

    fn is_dim_supported(&self, supported: &[usize]) -> Result<(), ArrayError> {
        if supported.contains(self) {
            Ok(())
        } else {
            Err(ArrayError::UnsupportedDimension { supported: supported.to_vec() })
        }
    }

    fn is_dim_unsupported(&self, unsupported: &[usize]) -> Result<(), ArrayError> {
        if unsupported.contains(self) {
            Err(ArrayError::UnsupportedDimension { supported: unsupported.to_vec() })
        } else {
            Ok(())
        }
    }
}

impl <T: ArrayElement> ValidateDimension for Array<T> {

    fn is_dim_supported(&self, supported: &[usize]) -> Result<(), ArrayError> {
        if supported.contains(&self.ndim()?) {
            Ok(())
        } else {
            Err(ArrayError::UnsupportedDimension { supported: supported.to_vec() })
        }
    }

    fn is_dim_unsupported(&self, unsupported: &[usize]) -> Result<(), ArrayError> {
        if unsupported.contains(&self.ndim()?) {
            Err(ArrayError::UnsupportedDimension { supported: unsupported.to_vec() })
        } else {
            Ok(())
        }
    }
}

impl <T: ArrayElement> ValidateDimension for Vec<Array<T>> {

    fn is_dim_supported(&self, unsupported: &[usize]) -> Result<(), ArrayError> {
        self.iter().map(Array::ndim).collect::<Vec<Result<usize, ArrayError>>>().has_error()?;
        if self.iter().any(|a| !unsupported.contains(&a.ndim().unwrap())) {
            Err(ArrayError::UnsupportedDimension { supported: unsupported.to_vec() })
        } else {
            Ok(())
        }
    }

    fn is_dim_unsupported(&self, unsupported: &[usize]) -> Result<(), ArrayError> {
        self.iter().map(Array::ndim).collect::<Vec<Result<usize, ArrayError>>>().has_error()?;
        if self.iter().any(|a| unsupported.contains(&a.ndim().unwrap())) {
            Err(ArrayError::UnsupportedDimension { supported: unsupported.to_vec() })
        } else {
            Ok(())
        }
    }
}