use secrecy::SecretString;
pub(crate) fn render(value: &serde_json::Value) -> SecretString {
match value {
serde_json::Value::String(text) => SecretString::new(text.clone().into()),
other => SecretString::new(other.to_string().into()),
}
}
pub(crate) fn render_field(value: &serde_json::Value) -> Option<SecretString> {
match value {
serde_json::Value::Null => None,
other => Some(render(other)),
}
}
#[cfg(test)]
mod tests {
use super::*;
use secrecy::ExposeSecret;
fn parse(raw: &str) -> serde_json::Value {
serde_json::from_str(raw).unwrap()
}
#[test]
fn render_takes_a_string_as_is_and_serializes_the_rest() {
assert_eq!(render(&parse(r#""s3cret""#)).expose_secret(), "s3cret");
assert_eq!(render(&parse("5432")).expose_secret(), "5432");
assert_eq!(render(&parse("true")).expose_secret(), "true");
assert_eq!(render(&parse(r#"{"a":1}"#)).expose_secret(), r#"{"a":1}"#);
}
#[test]
fn render_keeps_a_null_because_an_extract_pointer_reports_what_is_there() {
assert_eq!(render(&parse("null")).expose_secret(), "null");
}
#[test]
fn render_field_treats_a_null_as_absent() {
assert!(render_field(&parse("null")).is_none());
}
#[test]
fn render_field_agrees_with_render_on_everything_else() {
for raw in [r#""s3cret""#, "5432", "true", r#"{"a":1}"#, r#"["x"]"#] {
let value = parse(raw);
assert_eq!(
render_field(&value).unwrap().expose_secret(),
render(&value).expose_secret(),
"{raw}"
);
}
}
}