use strum_macros::{EnumString, IntoStaticStr};
use thiserror::Error;
use std::num::ParseIntError;
use crate::helper::macros::verbose_error_to_error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum CommandPushError {
#[error("Invalid indentation, expected {0}, got {1}")]
InvalidIndentation(usize, usize),
}
#[derive(Debug, Error, IntoStaticStr, EnumString)]
#[non_exhaustive]
pub enum ParseObjectError {
#[error("Unknown object type")]
UnknownObjectType,
#[error("Missing layer field")]
MissingLayer,
#[error("Invalid layer value")]
InvalidLayer,
#[error("Missing origin field")]
MissingOrigin,
#[error("Invalid origin value")]
InvalidOrigin,
#[error("Missing file path field")]
MissingFilePath,
#[error("Missing position x field")]
MissingPositionX,
#[error("Invalid position x value")]
InvalidPositionX,
#[error("Missing position y field")]
MissingPositionY,
#[error("Invalid position y value")]
InvalidPositionY,
#[error("Missing frame count field")]
MissingFrameCount,
#[error("Invalid frame count value")]
InvalidFrameCount,
#[error("Missing frame delay field")]
MissingFrameDelay,
#[error("Invalid frame delay value")]
InvalidFrameDelay,
#[error("Missing loop type field")]
MissingLoopType,
#[error("Invalid loop type value")]
InvalidLoopType,
}
verbose_error_to_error!(ParseObjectError);
#[derive(Debug, Error)]
#[error("The filepath needs to be a path relative to where the .osu file is, not a full path such as `C:\\folder\\image.png`")]
pub struct FilePathNotRelative;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseEasingError {
#[error(transparent)]
ParseValueError(#[from] ParseIntError),
#[error("Unknown easing type {0}")]
UnknownEasingType(usize),
}
#[derive(Debug, Error, EnumString, IntoStaticStr)]
#[non_exhaustive]
pub enum ParseCommandError {
#[error("Unknown command type")]
UnknownCommandType,
#[error("Missing `start_time` field")]
MissingStartTime,
#[error("Invalid `start_time` value")]
InvalidStartTime,
#[error("Missing `loop_count` field")]
MissingLoopCount,
#[error("Invalid `loop_count` value")]
InvalidLoopCount,
#[error("Missing `trigger_type` field")]
MissingTriggerType,
#[error("Invalid `trigger_type` value")]
InvalidTriggerType,
#[error("Invalid `group_number` value")]
InvalidGroupNumber,
#[error("Missing `end_time` field")]
MissingEndTime,
#[error("Invalid `end_time` value")]
InvalidEndTime,
#[error("Missing `easing` field")]
MissingEasing,
#[error("Invalid `easing` value")]
InvalidEasing,
#[error("Missing `red` field")]
MissingRed,
#[error("Missing `green` field")]
MissingGreen,
#[error("Missing `blue` field")]
MissingBlue,
#[error("Invalid `red` value")]
InvalidRed,
#[error("Invalid `green` value")]
InvalidGreen,
#[error("Invalid `blue` value")]
InvalidBlue,
#[error("Invalid continuing colour value")]
InvalidContinuingColours,
#[error("Missing `parameter_type` field")]
MissingParameterType,
#[error("Invalid `parameter_type` value")]
InvalidParameterType,
#[error("Invalid continuing parameter value")]
InvalidContinuingParameters,
#[error("Missing `move_x` field")]
MissingMoveX,
#[error("Invalid `move_x` value")]
InvalidMoveX,
#[error("Missing `move_y` field")]
MissingMoveY,
#[error("Invalid `move_y` value")]
InvalidMoveY,
#[error("Invalid continuing move value")]
InvalidContinuingMove,
#[error("Missing `scale_x` field")]
MissingScaleX,
#[error("Invalid `scale_x` value")]
InvalidScaleX,
#[error("Missing `scale_y` field")]
MissingScaleY,
#[error("Invalid `scale_y` value")]
InvalidScaleY,
#[error("Invalid continuing scale value")]
InvalidContinuingScales,
#[error("Missing `start_opacity` field")]
MissingStartOpacity,
#[error("Invalid `start_opacity` value")]
InvalidStartOpacity,
#[error("Invalid continuing opacity value")]
InvalidContinuingOpacities,
#[error("Missing `start_scale` field")]
MissingStartScale,
#[error("Invalid `start_scale` value")]
InvalidStartScale,
#[error("Invalid continuing scale value")]
InvalidContinuingScale,
#[error("Missing `start_rotation` field")]
MissingStartRotation,
#[error("Invalid `start_rotation` value")]
InvalidStartRotation,
#[error("Invalid continuing rotation value")]
InvalidContinuingRotation,
}
verbose_error_to_error!(ParseCommandError);
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseTriggerTypeError {
#[error("There are too many `HitSound` fields")]
TooManyHitSoundFields,
#[error(transparent)]
ParseFieldError(#[from] ParseIntError),
#[error("Unknown trigger type")]
UnknownTriggerType,
#[error("Unknown `HitSound` type")]
UnknownHitSoundType,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ContinuingRGBSetError {
#[error("continuing fields index out of bounds")]
IndexOutOfBounds,
#[error(transparent)]
InvalidFieldOption(#[from] InvalidColourFieldOption),
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum InvalidColourFieldOption {
#[error("continuing fields green field is none without it being the last item in the continuing fields")]
Green,
#[error("continuing fields blue field is none without it being the last item in the continuing fields")]
Blue,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseParameterError {
#[error("Unknown `Parameter` variant")]
UnknownVariant,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseAdditionError {
#[error("Unknown `Addition` variant")]
UnknownVariant,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseSampleSetError {
#[error("Unknown `SampleSet` variant")]
UnknownVariant,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseOriginError {
#[error("Unknown `Origin` variant")]
UnknownVariant,
#[error(transparent)]
ParseIntError(#[from] ParseIntError),
#[error(transparent)]
OriginTryFromIntError(#[from] OriginTryFromIntError),
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum OriginTryFromIntError {
#[error("Unknown `Origin` variant")]
UnknownVariant,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseLoopTypeError {
#[error("Unknown `LoopType` variant")]
UnknownVariant,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseLayerError {
#[error("Unknown `Layer` variant")]
UnknownVariant,
}