use serde_json::Value;
use crate::{
RedactionPolicy,
Sensitivity,
};
use super::internal::{
JsonRedactionState,
JsonUnkeyedValuePolicy,
};
pub fn redact_json_text_in_place(text: &mut String, policy: &RedactionPolicy) {
*text = redacted_json_text(text, policy);
}
pub(crate) fn redacted_json_text(
text: &str,
policy: &RedactionPolicy,
) -> String {
let Ok(mut value) = serde_json::from_str::<Value>(text) else {
return opaque_secret(policy);
};
let mut remaining_mask_bytes = usize::MAX;
let unkeyed = match policy.unkeyed_json_value_policy() {
crate::UnkeyedJsonValuePolicy::PassThrough => {
JsonUnkeyedValuePolicy::PassThrough
}
crate::UnkeyedJsonValuePolicy::Redact => {
let marker = policy.masking().mask_opaque(Sensitivity::Secret);
JsonUnkeyedValuePolicy::Redact {
marker,
truncated_marker: marker,
}
}
};
let mut state = JsonRedactionState::from_policy(
policy,
unkeyed,
&mut remaining_mask_bytes,
);
let _ = state.redact(&mut value);
serde_json::to_string(&value)
.expect("serde_json::Value serialization is infallible")
}
fn opaque_secret(policy: &RedactionPolicy) -> String {
policy.masking().mask_opaque(Sensitivity::Secret).to_owned()
}