use core::cmp::Ordering;
use core::fmt;
use core::hash::{Hash, Hasher};
use pi_result::Error;
#[non_exhaustive]
pub enum CreateTargetEvidence {
NotCreatedByOperation,
CreatedByOperation,
Unknown,
}
impl fmt::Debug for CreateTargetEvidence {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::NotCreatedByOperation => "NotCreatedByOperation",
Self::CreatedByOperation => "CreatedByOperation",
Self::Unknown => "Unknown",
})
}
}
impl fmt::Display for CreateTargetEvidence {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::NotCreatedByOperation => "target not created by operation",
Self::CreatedByOperation => "target created by operation",
Self::Unknown => "target creation outcome unknown",
})
}
}
impl PartialEq for CreateTargetEvidence {
fn eq(&self, other: &Self) -> bool {
matches!(
(self, other),
(
Self::NotCreatedByOperation,
Self::NotCreatedByOperation
) | (
Self::CreatedByOperation,
Self::CreatedByOperation
) | (Self::Unknown, Self::Unknown)
)
}
}
impl Eq for CreateTargetEvidence {}
impl PartialOrd for CreateTargetEvidence {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for CreateTargetEvidence {
fn cmp(&self, other: &Self) -> Ordering {
fn rank(evidence: &CreateTargetEvidence) -> u8 {
match evidence {
CreateTargetEvidence::NotCreatedByOperation => 0,
CreateTargetEvidence::CreatedByOperation => 1,
CreateTargetEvidence::Unknown => 2,
}
}
rank(self).cmp(&rank(other))
}
}
impl Hash for CreateTargetEvidence {
fn hash<H>(&self, state: &mut H)
where
H: Hasher,
{
let discriminant = match self {
Self::NotCreatedByOperation => 0_u8,
Self::CreatedByOperation => 1_u8,
Self::Unknown => 2_u8,
};
discriminant.hash(state);
}
}
pub struct CrossProcessCreateSuccess<A, F> {
file: F,
authority: A,
}
impl<A, F> CrossProcessCreateSuccess<A, F> {
#[must_use]
pub fn new(authority: A, file: F) -> Self {
Self { file, authority }
}
#[must_use]
pub fn authority(&self) -> &A {
&self.authority
}
#[must_use]
pub fn file(&self) -> &F {
&self.file
}
#[must_use]
pub fn file_mut(&mut self) -> &mut F {
&mut self.file
}
#[must_use]
pub fn into_parts(self) -> (A, F) {
(self.authority, self.file)
}
}
impl<A, F> fmt::Debug for CrossProcessCreateSuccess<A, F> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(
"CrossProcessCreateSuccess { authority: <present>, file: <present> }",
)
}
}
impl<A, F> fmt::Display for CrossProcessCreateSuccess<A, F> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(
"cross-process authority and file resource are present",
)
}
}
pub struct CreateFailure {
error: Error,
target_evidence: CreateTargetEvidence,
}
impl CreateFailure {
#[must_use]
pub fn new(error: Error, target_evidence: CreateTargetEvidence) -> Self {
Self {
error,
target_evidence,
}
}
#[must_use]
pub fn error(&self) -> &Error {
&self.error
}
#[must_use]
pub fn target_evidence(&self) -> &CreateTargetEvidence {
&self.target_evidence
}
#[must_use]
pub fn into_parts(self) -> (Error, CreateTargetEvidence) {
(self.error, self.target_evidence)
}
}
impl fmt::Debug for CreateFailure {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("CreateFailure")
.field("error", &self.error)
.field("target_evidence", &self.target_evidence)
.finish()
}
}
impl fmt::Display for CreateFailure {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"{}; target: {}",
self.error, self.target_evidence
)
}
}
pub struct CreateDirectoriesFailure<L> {
error: Error,
confirmed_created: Vec<L>,
uncertain_targets: Vec<L>,
}
impl<L> CreateDirectoriesFailure<L> {
#[must_use]
pub fn new(
error: Error,
confirmed_created: Vec<L>,
uncertain_targets: Vec<L>,
) -> Self {
Self {
error,
confirmed_created,
uncertain_targets,
}
}
#[must_use]
pub fn error(&self) -> &Error {
&self.error
}
#[must_use]
pub fn confirmed_created(&self) -> &[L] {
&self.confirmed_created
}
#[must_use]
pub fn uncertain_targets(&self) -> &[L] {
&self.uncertain_targets
}
#[must_use]
pub fn into_parts(self) -> (Error, Vec<L>, Vec<L>) {
(self.error, self.confirmed_created, self.uncertain_targets)
}
}
impl<L> fmt::Debug for CreateDirectoriesFailure<L> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("CreateDirectoriesFailure")
.field("error", &self.error)
.field("confirmed_created_count", &self.confirmed_created.len())
.field("uncertain_targets_count", &self.uncertain_targets.len())
.finish()
}
}
impl<L> fmt::Display for CreateDirectoriesFailure<L> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"{}; confirmed created: {}; uncertain targets: {}",
self.error,
self.confirmed_created.len(),
self.uncertain_targets.len()
)
}
}