use serde_json::Value;
pub trait ResponseTransformer: Send + Sync {
fn transform_response(&self, response: Value) -> Value;
fn transform_schema(&self, schema: Value) -> Value;
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
struct RemoveNulls;
impl ResponseTransformer for RemoveNulls {
fn transform_response(&self, response: Value) -> Value {
remove_nulls(response)
}
fn transform_schema(&self, schema: Value) -> Value {
schema
}
}
fn remove_nulls(value: Value) -> Value {
match value {
Value::Object(map) => {
let filtered: serde_json::Map<String, Value> = map
.into_iter()
.filter(|(_, v)| !v.is_null())
.map(|(k, v)| (k, remove_nulls(v)))
.collect();
Value::Object(filtered)
}
Value::Array(arr) => Value::Array(arr.into_iter().map(remove_nulls).collect()),
other => other,
}
}
#[test]
fn test_remove_nulls_transformer() {
let transformer = RemoveNulls;
let response = json!({
"id": 1,
"name": "Test",
"description": null,
"nested": {
"value": 42,
"optional": null
}
});
let transformed = transformer.transform_response(response);
assert_eq!(
transformed,
json!({
"id": 1,
"name": "Test",
"nested": {
"value": 42
}
})
);
}
#[test]
fn test_transformer_with_arrays() {
let transformer = RemoveNulls;
let response = json!({
"items": [
{"id": 1, "value": null},
{"id": 2, "value": "test"}
]
});
let transformed = transformer.transform_response(response);
assert_eq!(
transformed,
json!({
"items": [
{"id": 1},
{"id": 2, "value": "test"}
]
})
);
}
#[test]
fn test_transformer_preserves_non_null_values() {
let transformer = RemoveNulls;
let response = json!({
"string": "hello",
"number": 42,
"boolean": true,
"array": [1, 2, 3],
"object": {"key": "value"}
});
let transformed = transformer.transform_response(response.clone());
assert_eq!(transformed, response);
}
}