butterworth 0.1.0

A library for simple Butterworth filters.
Documentation
use std::error::Error;
use std::fmt;

#[derive(Debug, PartialEq)]
pub enum FilterError {
    NonPositiveCutoff(String),
    InvalidCutOff(String),
    NonPositiveSampleRate(String),
    InsufficientData(String)
}

impl Error for FilterError {}
impl fmt::Display for FilterError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "FilterError: {:?}", self)
    }
}

pub(crate) fn check_cutoff(cutoff: f64, sampling_rate: f64) -> Result<(), FilterError> {
    if cutoff <= 0.0 {
        Err(FilterError::NonPositiveCutoff(format!("Cutoff frequency must be positive, got {}",
                                                   cutoff)))
    } else if cutoff >= sampling_rate / 2.0 {
        Err(FilterError::InvalidCutOff(format!("Cutoff frequencies {} must be less than the \
        Nyquist frequency (half the sampling rate {})", cutoff, sampling_rate)))
    } else {
        Ok(())
    }
}

pub(crate) fn check_sample_rate(sample_rate: f64) -> Result<(), FilterError> {
    if sample_rate <= 0.0 {
        Err(FilterError::NonPositiveSampleRate(format!("Sample rate must be positive, got {}",
                                                       sample_rate)))
    } else {
        Ok(())
    }
}

pub(crate) fn check_data_length(data: &Vec<f64>, padding_length: usize) -> Result<(), FilterError> {
    if data.len() < padding_length {
        Err(FilterError::InsufficientData(format!("Data length {} must be larger than the padding \
        length {}. Default padding is 3 * filter order (doubled for band filters)",
                                                  data.len(), padding_length)))
    } else {
        Ok(())
    }
}