use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize)]
#[serde(transparent)]
pub struct StorageCredentialPayload(pub serde_json::Value);
impl std::fmt::Debug for StorageCredentialPayload {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("StorageCredentialPayload")
.field("kind", &self.0.get("kind"))
.field("configId", &self.0.get("configId"))
.finish_non_exhaustive()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn debug_never_shows_the_secret() {
let p = StorageCredentialPayload(serde_json::json!({
"kind": "s3", "configId": "r2", "accessKeyId": "AKID", "secretAccessKey": "hunter2"
}));
let d = format!("{p:?}");
assert!(!d.contains("hunter2") && !d.contains("AKID"), "{d}");
assert!(d.contains("r2"));
}
}