use serde_json::Value;
use super::JsonAdmissionError;
use super::json_redaction_writer::admit_json_text_value;
use super::json_redaction_writer::invalid_json_output;
use super::json_redaction_writer::passthrough_json_text_with_limit;
use super::json_redaction_writer::redact_json_value_with_limit;
use crate::runtime::BatchSession;
use crate::runtime::RedactionHandle;
use crate::runtime::runtime_session::RuntimeSession;
pub(crate) fn redact_text(session: &mut BatchSession, text: &str) -> RedactionHandle {
if session.is_output_exhausted() {
return session.stage_exhausted_handle();
}
if !session.admit_input(text.len()) {
return session.stage_rendered_operation(
crate::runtime::OperationSink::truncated("<truncated>", crate::RedactionReason::InputLimitReached).finish(),
);
}
let result = if session.policy().is_disabled() {
passthrough_json_text_with_limit(text, session.remaining_output_bytes())
} else {
match admit_json_text_value(session, text) {
Ok(value) => redact_json_value_with_limit(session.policy(), &value, session.remaining_output_bytes()),
Err(JsonAdmissionError::Invalid) => invalid_json_output(session.policy(), session.remaining_output_bytes()),
Err(JsonAdmissionError::Limit) => {
return session.stage_accounted_text("<truncated>");
}
}
};
session.stage_rendered_operation(result)
}
pub(crate) fn redact_value(session: &mut BatchSession, value: &Value) -> RedactionHandle {
if session.is_output_exhausted() {
session.stage_exhausted_handle()
} else if !session.admit_json_value(value) {
session.stage_accounted_text("<truncated>")
} else {
let result = redact_json_value_with_limit(session.policy(), value, session.remaining_output_bytes());
session.stage_rendered_operation(result)
}
}