use rhai::Dynamic;
pub(crate) fn format_dynamic_value(value: &Dynamic) -> (String, bool) {
if value.is_string() {
if let Ok(s) = value.clone().into_string() {
(s, true) } else {
(value.to_string(), false)
}
} else {
(value.to_string(), false)
}
}
pub(super) fn indent_multiline_value(value: &str, indent: &str) -> String {
let mut lines = value.lines();
match lines.next() {
Some(first_line) => {
let mut output = String::from(first_line);
for line in lines {
output.push('\n');
output.push_str(indent);
output.push_str(line);
}
output
}
None => String::new(),
}
}
pub(super) fn dynamic_to_json(value: &Dynamic) -> serde_json::Value {
if value.is_string() {
if let Ok(s) = value.clone().into_string() {
serde_json::Value::String(s)
} else {
serde_json::Value::Null
}
} else if value.is_int() {
if let Ok(i) = value.as_int() {
serde_json::Value::Number(serde_json::Number::from(i))
} else {
serde_json::Value::Null
}
} else if value.is_float() {
if let Ok(f) = value.as_float() {
serde_json::Number::from_f64(f)
.map(serde_json::Value::Number)
.unwrap_or(serde_json::Value::Null)
} else {
serde_json::Value::Null
}
} else if value.is_bool() {
if let Ok(b) = value.as_bool() {
serde_json::Value::Bool(b)
} else {
serde_json::Value::Null
}
} else if value.is_unit() {
serde_json::Value::Null
} else if let Some(arr) = value.clone().try_cast::<rhai::Array>() {
let json_array: Vec<serde_json::Value> = arr.iter().map(dynamic_to_json).collect();
serde_json::Value::Array(json_array)
} else if let Some(map) = value.clone().try_cast::<rhai::Map>() {
let mut json_obj = serde_json::Map::new();
for (key, val) in map {
json_obj.insert(key.to_string(), dynamic_to_json(&val));
}
serde_json::Value::Object(json_obj)
} else {
serde_json::Value::String(value.to_string())
}
}