/
mcmare
/
RustAPI
Обзор
Документация
Войти
/
mcmare
/
RustAPI
Код
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v0.1.0
engine/src/script/convert.rs
61 строка
2 KB
mcmare
Add Rhai scripting layer: host functions (db/hash/jwt), per-script transactions
18 июл 2026, 16:32
18 июл 2026, 16:32
4bfc229
Код
Авторство
О чём код?
use rhai::{Dynamic, Map as RhaiMap}; use serde_json::Value; /// JSON -> Rhai. Objects become Rhai object maps (which support `.field` dot access), /// so a script can read `request.body.email` directly. pub fn json_to_dynamic(value: &Value) -> Dynamic { match value { Value::Null => Dynamic::UNIT, Value::Bool(b) => Dynamic::from(*b), Value::Number(n) => { if let Some(i) = n.as_i64() { Dynamic::from(i) } else { Dynamic::from(n.as_f64().unwrap_or(0.0)) } } Value::String(s) => Dynamic::from(s.clone()), Value::Array(items) => { let arr: rhai::Array = items.iter().map(json_to_dynamic).collect(); Dynamic::from(arr) } Value::Object(map) => { let mut out = RhaiMap::new(); for (k, v) in map { out.insert(k.as_str().into(), json_to_dynamic(v)); } Dynamic::from_map(out) } } } /// Rhai -> JSON, used to turn a script's `response.json(...)` payload (and DB bind /// params that aren't a plain scalar) into `serde_json::Value`. pub fn dynamic_to_json(value: &Dynamic) -> Value { if value.is_unit() { return Value::Null; } if let Some(b) = value.clone().try_cast::<bool>() { return Value::Bool(b); } if let Some(i) = value.clone().try_cast::<i64>() { return Value::Number(i.into()); } if let Some(f) = value.clone().try_cast::<f64>() { return serde_json::Number::from_f64(f).map(Value::Number).unwrap_or(Value::Null); } if let Some(s) = value.clone().try_cast::<rhai::ImmutableString>() { return Value::String(s.to_string()); } if let Some(arr) = value.clone().try_cast::<rhai::Array>() { return Value::Array(arr.iter().map(dynamic_to_json).collect()); } if let Some(map) = value.clone().try_cast::<RhaiMap>() { let mut obj = serde_json::Map::new(); for (k, v) in map.iter() { obj.insert(k.to_string(), dynamic_to_json(v)); } return Value::Object(obj); } Value::String(value.to_string()) }