Skip to content

Commit 33b05b4

Browse files
committed
(feat) use rhai 0.17 serde feature
1 parent 3b6d79c commit 33b05b4

File tree

2 files changed

+12
-34
lines changed

2 files changed

+12
-34
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pest_derive = "2.1.0"
2828
serde = "1.0.0"
2929
serde_json = "1.0.39"
3030
walkdir = { version = "2.2.3", optional = true }
31-
rhai = { version = "0.17.0", optional = true, features = ["sync"] }
31+
rhai = { version = "0.17.0", optional = true, features = ["sync", "serde"] }
3232

3333
[dev-dependencies]
3434
env_logger = "0.7.1"

src/helpers/scripting.rs

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use crate::json::value::{PathAndJson, ScopedJson};
77
use crate::registry::Registry;
88
use crate::render::{Helper, RenderContext};
99

10-
use rhai::{Dynamic, Engine, ImmutableString, Scope, AST};
10+
use rhai::ser::to_dynamic;
11+
use rhai::{Dynamic, Engine, Scope, AST};
1112

1213
use serde_json::value::{Map, Number, Value as Json};
1314

@@ -22,16 +23,13 @@ fn call_script_helper<'reg: 'rc, 'rc>(
2223
engine: &Engine,
2324
script: &AST,
2425
) -> Result<Option<ScopedJson<'reg, 'rc>>, RenderError> {
25-
let params: Dynamic = params
26-
.iter()
27-
.map(|p| to_dynamic(p.value()))
28-
.collect::<Vec<Dynamic>>()
29-
.into();
30-
let hash: Dynamic = hash
31-
.iter()
32-
.map(|(k, v)| ((*k).to_owned(), to_dynamic(v.value())))
33-
.collect::<HashMap<String, Dynamic>>()
34-
.into();
26+
let params: Dynamic = to_dynamic(params.iter().map(|p| p.value()).collect::<Vec<&Json>>())?;
27+
28+
let hash: Dynamic = to_dynamic(
29+
hash.iter()
30+
.map(|(k, v)| ((*k).to_owned(), v.value()))
31+
.collect::<HashMap<String, &Json>>(),
32+
)?;
3533

3634
let mut scope = Scope::new();
3735
scope.push_dynamic("params", params);
@@ -58,26 +56,6 @@ impl HelperDef for ScriptHelper {
5856
}
5957
}
6058

61-
fn to_dynamic(j: &Json) -> Dynamic {
62-
match j {
63-
Json::Number(n) => Dynamic::from(n.clone()),
64-
Json::Bool(b) => Dynamic::from(*b),
65-
Json::Null => Dynamic::from(()),
66-
Json::String(s) => Dynamic::from(s.clone()),
67-
Json::Array(ref v) => {
68-
let dyn_vec: Vec<Dynamic> = v.iter().map(|i| to_dynamic(i)).collect();
69-
Dynamic::from(dyn_vec)
70-
}
71-
Json::Object(ref o) => {
72-
let dyn_map: HashMap<ImmutableString, Dynamic> = o
73-
.iter()
74-
.map(|(k, v)| (ImmutableString::from(k.as_str()), to_dynamic(v)))
75-
.collect();
76-
Dynamic::from(dyn_map)
77-
}
78-
}
79-
}
80-
8159
fn to_json(d: &Dynamic) -> Json {
8260
if let Ok(s) = d.as_str() {
8361
return Json::String(s.to_owned());
@@ -126,15 +104,15 @@ mod test {
126104
[{"name": "tomcat"}, {"name": "jetty"}]
127105
};
128106

129-
let d0 = to_dynamic(&j0);
107+
let d0 = to_dynamic(&j0).unwrap();
130108
assert_eq!("array", d0.type_name());
131109

132110
let j1 = json!({
133111
"name": "tomcat",
134112
"value": 4000,
135113
});
136114

137-
let d1 = to_dynamic(&j1);
115+
let d1 = to_dynamic(&j1).unwrap();
138116
assert_eq!("map", d1.type_name());
139117
}
140118

0 commit comments

Comments
 (0)