use anyhow::{Context, Result};
use serde_json::Value;
#[allow(dead_code)]
pub fn safe_json_to_element_value(json_value: &Value) -> Result<drasi_core::models::ElementValue> {
drasi_lib::sources::convert_json_to_element_value(json_value)
.with_context(|| format!("Failed to convert JSON value to Element value: {json_value:?}"))
}
pub fn json_to_element_value_or_default(
json_value: &Value,
default: drasi_core::models::ElementValue,
) -> drasi_core::models::ElementValue {
match drasi_lib::sources::convert_json_to_element_value(json_value) {
Ok(value) => value,
Err(e) => {
log::warn!("Failed to convert JSON to Element value, using default: {e}");
default
}
}
}
#[allow(dead_code)]
pub fn batch_json_to_element_values<'a>(
values: impl Iterator<Item = &'a Value>,
) -> Vec<drasi_core::models::ElementValue> {
values
.filter_map(|json_value| {
match drasi_lib::sources::convert_json_to_element_value(json_value) {
Ok(value) => Some(value),
Err(e) => {
log::error!(
"Skipping invalid JSON value during batch conversion: {json_value:?}, error: {e}"
);
None
}
}
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_safe_json_to_element_value() {
let number = json!(42);
let result = safe_json_to_element_value(&number);
assert!(result.is_ok());
let string = json!("test");
let result = safe_json_to_element_value(&string);
assert!(result.is_ok());
let boolean = json!(true);
let result = safe_json_to_element_value(&boolean);
assert!(result.is_ok());
}
#[test]
fn test_json_to_element_value_or_default() {
let valid = json!(42);
let default = drasi_core::models::ElementValue::Null;
let result = json_to_element_value_or_default(&valid, default.clone());
assert!(matches!(
result,
drasi_core::models::ElementValue::Integer(_)
));
}
#[test]
fn test_batch_json_to_element_values() {
let values = [json!(1), json!("test"), json!(true), json!(null)];
let results = batch_json_to_element_values(values.iter());
assert!(!results.is_empty());
}
}