diff --git a/Cargo.lock b/Cargo.lock index 7a2e10f6c..942eca38c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2812,7 +2812,9 @@ dependencies = [ name = "safelog" version = "0.1.3" dependencies = [ + "derive_more", "educe", + "either", "fluid-let", "serde", "serial_test", diff --git a/crates/safelog/Cargo.toml b/crates/safelog/Cargo.toml index 4f18fb875..b38e0e078 100644 --- a/crates/safelog/Cargo.toml +++ b/crates/safelog/Cargo.toml @@ -16,7 +16,9 @@ repository = "https://gitlab.torproject.org/tpo/core/arti.git/" default = [] [dependencies] +derive_more = "0.99.3" educe = "0.4.6" +either = "1" fluid-let = "1" serde = { version = "1.0.103", optional = true, features = ["derive"] } thiserror = "1" diff --git a/crates/safelog/src/lib.rs b/crates/safelog/src/lib.rs index 787f72e42..ca4601382 100644 --- a/crates/safelog/src/lib.rs +++ b/crates/safelog/src/lib.rs @@ -222,9 +222,9 @@ pub trait Redactable: std::fmt::Display + std::fmt::Debug { /// Return a smart pointer that redacts this object if `redact` is true. fn maybe_redacted(&self, redact: bool) -> MaybeRedacted<&Self> { if redact { - MaybeRedacted::Redacted(Redacted(self)) + MaybeRedacted(either::Either::Right(Redacted(self))) } else { - MaybeRedacted::NotRedacted(self) + MaybeRedacted(either::Either::Left(self)) } } } @@ -287,29 +287,15 @@ impl std::fmt::Debug for Redacted { /// An object that may or may not be redacted. /// /// Used to implement conditional redaction -#[derive(Clone)] -#[allow(clippy::exhaustive_enums)] -pub enum MaybeRedacted { - /// A variant where we are redacting the object. - Redacted(Redacted), - /// A variant where we are not redacting the object. - NotRedacted(T), -} - -impl std::fmt::Display for MaybeRedacted { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - MaybeRedacted::Redacted(v) => std::fmt::Display::fmt(v, f), - MaybeRedacted::NotRedacted(v) => std::fmt::Display::fmt(v, f), - } - } -} +#[derive(Clone, derive_more::Display)] +pub struct MaybeRedacted(either::Either>); impl std::fmt::Debug for MaybeRedacted { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - MaybeRedacted::Redacted(v) => std::fmt::Debug::fmt(v, f), - MaybeRedacted::NotRedacted(v) => std::fmt::Debug::fmt(v, f), + use std::fmt::Debug; + match &self.0 { + either::Either::Left(v) => Debug::fmt(v, f), + either::Either::Right(v) => Debug::fmt(v, f), } } }