nadesiko3rust/
lib.rs

1//! # Nadesiko Script v3
2//! Nadesiko is one of Japanese programming languages.
3//! You can write the code using Japanese.
4//! 
5//! # Example
6//! ```
7//! use nadesiko3rust::*;
8//! // 文字を表示
9//! let result = eval_str("「こんにちは」と表示");
10//! println!("{}", result);
11//! // 計算して表示
12//! let result = eval_str("1+2×3と表示");
13//! println!("{}", result);
14//! // 以下のように記述することもできます
15//! let result = eval_str("1に2を足して表示");
16//! println!("{}", result);
17//! ```
18//! 
19//! # Current Structure
20//! ```text
21//! source(&str) → Tokenize(Vec<Token>) → Parse(Vec<Node>) => Run(runner)
22//! ```
23//! @see runner::eval()
24//! 
25
26mod 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/// モジュール呼び出し側で定義しなければいけない関数
39#[wasm_bindgen]
40extern "C" {
41    fn nako3_handler(name: &str, s: &str) -> String;
42}
43
44/// 引数codeに指定したプログラムを実行して結果を文字列で返す
45pub fn eval_str(code: &str) -> String {
46    runner::eval_str(code)
47}
48
49/// 引数codeに指定したプログラムを実行して結果をNodeValueで返す
50pub fn eval(code: &str) -> Result<node::NodeValue, String> {
51    runner::eval(code, runner::RunOption::normal())
52}
53
54// #[cfg(target_arch = "wasm32")]
55mod 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}