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