use thiserror::Error;
#[derive(Debug, Error)]
pub enum FeatureFactoryError {
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("DataFusion error: {0}")]
DataFusionError(#[from] datafusion::error::DataFusionError),
#[error("Arrow error: {0}")]
ArrowError(#[from] arrow::error::ArrowError),
#[error("Parquet error: {0}")]
ParquetError(#[from] parquet::errors::ParquetError),
#[error("Invalid parameter: {0}")]
InvalidParameter(String),
#[error("Unsupported format: {0}")]
UnsupportedFormat(String),
#[error("Not implemented: {0}")]
NotImplemented(String),
#[error("Missing column: {0}")]
MissingColumn(String),
#[error("Transform called before fit for stateful transformer")]
FitNotCalled,
}
pub type FeatureFactoryResult<T> = std::result::Result<T, FeatureFactoryError>;
#[cfg(test)]
mod tests {
use super::*;
use std::io;
#[test]
fn test_io_error() {
let io_err = io::Error::new(io::ErrorKind::Other, "test io error");
let err: FeatureFactoryError = io_err.into();
let err_msg = format!("{}", err);
assert!(err_msg.contains("I/O error:"));
assert!(err_msg.contains("test io error"));
}
#[test]
fn test_datafusion_error() {
let df_err = datafusion::error::DataFusionError::Plan("test plan error".into());
let err: FeatureFactoryError = df_err.into();
let err_msg = format!("{}", err);
assert!(err_msg.contains("DataFusion error:"));
assert!(err_msg.contains("test plan error"));
}
#[test]
fn test_arrow_error() {
let arrow_err = arrow::error::ArrowError::ComputeError("test compute error".into());
let err: FeatureFactoryError = arrow_err.into();
let err_msg = format!("{}", err);
assert!(err_msg.contains("Arrow error:"));
assert!(err_msg.contains("test compute error"));
}
#[test]
fn test_parquet_error() {
let parquet_err = parquet::errors::ParquetError::General("test parquet error".into());
let err: FeatureFactoryError = parquet_err.into();
let err_msg = format!("{}", err);
assert!(err_msg.contains("Parquet error:"));
assert!(err_msg.contains("test parquet error"));
}
#[test]
fn test_invalid_parameter_error() {
let err = FeatureFactoryError::InvalidParameter("bad param".into());
let err_msg = format!("{}", err);
assert!(err_msg.contains("Invalid parameter:"));
assert!(err_msg.contains("bad param"));
}
#[test]
fn test_unsupported_format_error() {
let err = FeatureFactoryError::UnsupportedFormat("unknown format".into());
let err_msg = format!("{}", err);
assert!(err_msg.contains("Unsupported format:"));
assert!(err_msg.contains("unknown format"));
}
#[test]
fn test_not_implemented_error() {
let err = FeatureFactoryError::NotImplemented("feature not implemented".into());
let err_msg = format!("{}", err);
assert!(err_msg.contains("Not implemented:"));
assert!(err_msg.contains("feature not implemented"));
}
#[test]
fn test_missing_column_error() {
let err = FeatureFactoryError::MissingColumn("missing column".into());
let err_msg = format!("{}", err);
assert!(err_msg.contains("Missing column:"));
assert!(err_msg.contains("missing column"));
}
#[test]
fn test_fit_not_called_error() {
let err = FeatureFactoryError::FitNotCalled;
let err_msg = format!("{}", err);
assert!(err_msg.contains("Transform called before fit for stateful transformer"));
}
}