use core::cmp::Ordering;
use core::fmt;
use core::hash::{Hash, Hasher};
use pi_result::Error;
#[non_exhaustive]
pub enum RenameCommitEvidence {
NotRenamedByOperation,
RenamedByOperation,
Unknown,
}
impl fmt::Debug for RenameCommitEvidence {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::NotRenamedByOperation => "NotRenamedByOperation",
Self::RenamedByOperation => "RenamedByOperation",
Self::Unknown => "Unknown",
})
}
}
impl fmt::Display for RenameCommitEvidence {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::NotRenamedByOperation => "rename not committed by operation",
Self::RenamedByOperation => "rename committed by operation",
Self::Unknown => "rename commit outcome unknown",
})
}
}
impl PartialEq for RenameCommitEvidence {
fn eq(&self, other: &Self) -> bool {
matches!(
(self, other),
(
Self::NotRenamedByOperation,
Self::NotRenamedByOperation
) | (
Self::RenamedByOperation,
Self::RenamedByOperation
) | (Self::Unknown, Self::Unknown)
)
}
}
impl Eq for RenameCommitEvidence {}
impl PartialOrd for RenameCommitEvidence {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for RenameCommitEvidence {
fn cmp(&self, other: &Self) -> Ordering {
fn rank(evidence: &RenameCommitEvidence) -> u8 {
match evidence {
RenameCommitEvidence::NotRenamedByOperation => 0,
RenameCommitEvidence::RenamedByOperation => 1,
RenameCommitEvidence::Unknown => 2,
}
}
rank(self).cmp(&rank(other))
}
}
impl Hash for RenameCommitEvidence {
fn hash<H>(&self, state: &mut H)
where
H: Hasher,
{
let discriminant = match self {
Self::NotRenamedByOperation => 0_u8,
Self::RenamedByOperation => 1_u8,
Self::Unknown => 2_u8,
};
discriminant.hash(state);
}
}
pub struct RenameFailure {
error: Error,
commit_evidence: RenameCommitEvidence,
}
impl RenameFailure {
#[must_use]
pub fn new(error: Error, commit_evidence: RenameCommitEvidence) -> Self {
Self {
error,
commit_evidence,
}
}
#[must_use]
pub fn error(&self) -> &Error {
&self.error
}
#[must_use]
pub fn commit_evidence(&self) -> &RenameCommitEvidence {
&self.commit_evidence
}
#[must_use]
pub fn into_parts(self) -> (Error, RenameCommitEvidence) {
(self.error, self.commit_evidence)
}
}
impl fmt::Debug for RenameFailure {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("RenameFailure")
.field("error", &self.error)
.field("commit_evidence", &self.commit_evidence)
.finish()
}
}
impl fmt::Display for RenameFailure {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"{}; commit: {}",
self.error, self.commit_evidence
)
}
}