use crate::{
ecs::events::{
command::CommandFailureDiagnostic,
operation::{OperationFailureClass, OperationFailureSource, OperationRetryAdvice},
},
fs_utils::FileWriteError,
vim::VimError,
};
#[derive(Debug)]
pub(super) enum BufferCommandError {
Vim(VimError),
Write(FileWriteError),
FilesystemUnavailable,
}
impl BufferCommandError {
pub(super) const fn class(&self) -> OperationFailureClass {
match self {
Self::Vim(_) => OperationFailureClass::UserVisible,
Self::Write(_) => OperationFailureClass::Persistence,
Self::FilesystemUnavailable => OperationFailureClass::RuntimeConfig,
}
}
pub(super) const fn status_error(&self) -> VimError {
match self {
Self::Vim(error) => *error,
Self::Write(_) | Self::FilesystemUnavailable => VimError::CantOpenFileForWriting,
}
}
pub(super) fn diagnostic(&self) -> CommandFailureDiagnostic {
CommandFailureDiagnostic {
class: self.class(),
status_error: self.status_error(),
source: self.source_shape(),
retry: self.retry_advice(),
}
}
fn source_shape(&self) -> Option<OperationFailureSource> {
match self {
Self::Write(error) => Some(OperationFailureSource::from_file_write_error(error)),
Self::Vim(_) | Self::FilesystemUnavailable => None,
}
}
pub(super) const fn write_error(&self) -> Option<&FileWriteError> {
match self {
Self::Write(error) => Some(error),
Self::Vim(_) | Self::FilesystemUnavailable => None,
}
}
pub(super) fn retry_advice(&self) -> OperationRetryAdvice {
match self {
Self::Write(error) => {
OperationFailureSource::from_file_write_error(error).retry_advice()
}
Self::Vim(_) | Self::FilesystemUnavailable => OperationRetryAdvice::RetryAfterChange,
}
}
}