Skip to main content

rosu_pp/any/
calc_error.rs

1use std::{
2    error::Error,
3    fmt::{Display, Formatter, Result as FmtResult},
4};
5
6use crate::model::{beatmap::TooSuspicious, mode::ConvertError};
7
8/// Error type when beatmap conversion or its suspicion-check fails.
9#[derive(Copy, Clone, Debug)]
10pub enum CalculateError {
11    /// Conversion failed.
12    Convert(ConvertError),
13    /// Suspicion check failed.
14    Suspicion(TooSuspicious),
15}
16
17impl Error for CalculateError {
18    fn source(&self) -> Option<&(dyn Error + 'static)> {
19        match self {
20            CalculateError::Convert(err) => Some(err),
21            CalculateError::Suspicion(err) => Some(err),
22        }
23    }
24}
25
26impl Display for CalculateError {
27    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
28        f.write_str("Failed to calculate attributes")?;
29
30        match self {
31            CalculateError::Convert(_) => f.write_str(" (Convert)")?,
32            CalculateError::Suspicion(_) => f.write_str(" (Suspicion)")?,
33        }
34
35        Ok(())
36    }
37}
38
39impl From<ConvertError> for CalculateError {
40    fn from(value: ConvertError) -> Self {
41        CalculateError::Convert(value)
42    }
43}
44
45impl From<TooSuspicious> for CalculateError {
46    fn from(value: TooSuspicious) -> Self {
47        CalculateError::Suspicion(value)
48    }
49}