use serde::de::DeserializeOwned;
use serde::Serialize;
use serde_json::Value;
pub fn as_json<T: Serialize>(value: &T) -> Value {
serde_json::to_value(value).unwrap_or(Value::Null)
}
pub fn as_json_only<T: Serialize>(value: &T, keys: &[&str]) -> Value {
filter_object(as_json(value), |k| keys.contains(&k))
}
pub fn as_json_except<T: Serialize>(value: &T, keys: &[&str]) -> Value {
filter_object(as_json(value), |k| !keys.contains(&k))
}
fn filter_object(value: Value, keep: impl Fn(&str) -> bool) -> Value {
match value {
Value::Object(map) => Value::Object(map.into_iter().filter(|(k, _)| keep(k)).collect()),
other => other,
}
}
pub fn serialize_column<T: Serialize>(value: &T) -> doido_core::Result<String> {
serde_json::to_string(value)
.map_err(|e| doido_core::anyhow::anyhow!("serialize_column failed: {e}"))
}
pub fn deserialize_column<T: DeserializeOwned>(raw: &str) -> doido_core::Result<T> {
serde_json::from_str(raw)
.map_err(|e| doido_core::anyhow::anyhow!("deserialize_column failed: {e}"))
}