1mod wasm_function;
27use wasm_bindgen::prelude::*;
28
29use nadesiko3::*;
30
31
32#[wasm_bindgen]
33extern "C" {
34 #[wasm_bindgen(js_namespace = console)]
35 fn log(s: &str);
36}
37
38#[wasm_bindgen]
40extern "C" {
41 fn nako3_handler(name: &str, s: &str) -> String;
42}
43
44pub fn eval_str(code: &str) -> String {
46 runner::eval_str(code)
47}
48
49pub fn eval(code: &str) -> Result<node::NodeValue, String> {
51 runner::eval(code, runner::RunOption::normal())
52}
53
54mod wasm {
56 use node::*;
57 use wasm_bindgen::prelude::*;
58 use super::*;
59
60 pub fn nako3_print(s: &str) {
61 nako3_handler("print", s);
62 }
63
64 pub fn nako3_run(ctx: &mut NodeContext, code: &str) -> Result<NodeValue, String> {
65 ctx.print_fn = Some(nako3_print);
66 ctx.set_filename("main.nako3");
67 nadesiko3::sys_function::register(ctx);
68 wasm_function::register(ctx);
69 runner::eval_context(ctx, code)
70 }
71
72 #[wasm_bindgen]
73 pub fn nako_eval_str(code: &str) -> String {
74 let mut ctx = NodeContext::new();
75 let result = nako3_run(&mut ctx, code);
76 match result {
77 Ok(v) => v.to_string(),
78 Err(e) => format!("!!{}", e.to_string()),
79 }
80 }
81 #[wasm_bindgen]
82 pub fn nako_eval_getlogs(code: &str) -> String {
83 let mut ctx = NodeContext::new();
84 let result = nako3_run(&mut ctx, code);
85 match result {
86 Ok(_) => ctx.print_log.clone(),
87 Err(e) => format!("!!{}", e.to_string()),
88 }
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95 #[test]
96 fn eval_str_test() {
97 let r = eval_str("「こんにちは」と表示。");
98 assert_eq!(r, String::from("こんにちは"));
99 let r = eval_str("1+2×3と表示。");
100 assert_eq!(r, String::from("7"));
101 let r = eval_str("1に2を足して3を掛けて表示。");
102 assert_eq!(r, String::from("9"));
103 }
104}