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(())
}
}