wbt 0.2.1

Weight-based backtesting engine for quantitative trading
use polars::error::PolarsError;
use thiserror::Error;

#[derive(Debug, Error)]
pub enum WbtError {
    #[error("expected value for {0}, got None")]
    NoneValue(String),

    #[error("io: {0}")]
    Io(String),

    #[error("polars: {0}")]
    Polars(#[from] PolarsError),

    #[error("returns should not be empty")]
    ReturnsEmpty,

    #[error("{0:#}")]
    Unexpected(#[from] anyhow::Error),
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn none_value_display() {
        let err = WbtError::NoneValue("test_field".into());
        assert_eq!(err.to_string(), "expected value for test_field, got None");
    }

    #[test]
    fn returns_empty_display() {
        let err = WbtError::ReturnsEmpty;
        assert_eq!(err.to_string(), "returns should not be empty");
    }

    #[test]
    fn from_anyhow() {
        let anyhow_err = anyhow::anyhow!("something went wrong");
        let wbt_err: WbtError = anyhow_err.into();
        assert!(wbt_err.to_string().contains("something went wrong"));
    }
}