safelog: Make MaybeRedacted<T> opaque.

This commit is contained in:
Nick Mathewson 2022-11-27 14:54:30 -05:00
parent cf9f29158f
commit a77172e20d
3 changed files with 12 additions and 22 deletions

2
Cargo.lock generated
View File

@ -2812,7 +2812,9 @@ dependencies = [
name = "safelog"
version = "0.1.3"
dependencies = [
"derive_more",
"educe",
"either",
"fluid-let",
"serde",
"serial_test",

View File

@ -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"

View File

@ -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<T: Redactable> std::fmt::Debug for Redacted<T> {
/// An object that may or may not be redacted.
///
/// Used to implement conditional redaction
#[derive(Clone)]
#[allow(clippy::exhaustive_enums)]
pub enum MaybeRedacted<T: Redactable> {
/// A variant where we are redacting the object.
Redacted(Redacted<T>),
/// A variant where we are not redacting the object.
NotRedacted(T),
}
impl<T: Redactable> std::fmt::Display for MaybeRedacted<T> {
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<T: Redactable>(either::Either<T, Redacted<T>>);
impl<T: Redactable> std::fmt::Debug for MaybeRedacted<T> {
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),
}
}
}