Implement Phase 0: Stabilize CLI build with feature separation
Co-authored-by: moe-charm <217100418+moe-charm@users.noreply.github.com>
This commit is contained in:
78
Cargo.toml
78
Cargo.toml
@ -9,50 +9,110 @@ repository = "https://github.com/user/nyash"
|
|||||||
keywords = ["language", "interpreter", "box", "memory-safe", "rust"]
|
keywords = ["language", "interpreter", "box", "memory-safe", "rust"]
|
||||||
categories = ["development-tools::parsing", "interpreters"]
|
categories = ["development-tools::parsing", "interpreters"]
|
||||||
|
|
||||||
|
# Default features - minimal CLI only
|
||||||
|
[features]
|
||||||
|
default = ["cli"]
|
||||||
|
cli = []
|
||||||
|
gui = ["dep:egui", "dep:eframe", "dep:egui_extras", "dep:image"]
|
||||||
|
gui-examples = ["gui"]
|
||||||
|
all-examples = ["gui-examples"]
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "nyash_rust"
|
name = "nyash_rust"
|
||||||
path = "src/lib.rs"
|
path = "src/lib.rs"
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
|
# Main CLI binary - always available
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "nyash"
|
name = "nyash"
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
|
# GUI examples - only built with gui-examples feature
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "simple_notepad"
|
name = "simple_notepad"
|
||||||
path = "examples/simple_notepad.rs"
|
path = "examples/simple_notepad.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "nyash_notepad"
|
name = "nyash_notepad"
|
||||||
path = "examples/simple_notepad_v2.rs"
|
path = "examples/simple_notepad_v2.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "nyash_notepad_ascii"
|
name = "nyash_notepad_ascii"
|
||||||
path = "examples/simple_notepad_ascii.rs"
|
path = "examples/simple_notepad_ascii.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "debug_notepad"
|
name = "debug_notepad"
|
||||||
path = "examples/debug_notepad.rs"
|
path = "examples/debug_notepad.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "nyash_notepad_jp"
|
name = "nyash_notepad_jp"
|
||||||
path = "examples/nyash_notepad_jp.rs"
|
path = "examples/nyash_notepad_jp.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "nyash_explorer"
|
name = "nyash_explorer"
|
||||||
path = "examples/nyash_explorer.rs"
|
path = "examples/nyash_explorer.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "nyash_explorer_icons"
|
name = "nyash_explorer_icons"
|
||||||
path = "examples/nyash_explorer_with_icons.rs"
|
path = "examples/nyash_explorer_with_icons.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
[[example]]
|
|
||||||
name = "visual_node_prototype"
|
|
||||||
path = "development/egui_research/experiments/visual_node_prototype.rs"
|
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "test_icon_extraction"
|
name = "test_icon_extraction"
|
||||||
path = "examples/test_icon_extraction.rs"
|
path = "examples/test_icon_extraction.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
# Examples for development - only available as examples, not bins
|
||||||
|
[[example]]
|
||||||
|
name = "gui_simple_notepad"
|
||||||
|
path = "examples/simple_notepad.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_simple_notepad_v2"
|
||||||
|
path = "examples/simple_notepad_v2.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_simple_notepad_ascii"
|
||||||
|
path = "examples/simple_notepad_ascii.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_debug_notepad"
|
||||||
|
path = "examples/debug_notepad.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_nyash_notepad_jp"
|
||||||
|
path = "examples/nyash_notepad_jp.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_nyash_explorer"
|
||||||
|
path = "examples/nyash_explorer.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_nyash_explorer_with_icons"
|
||||||
|
path = "examples/nyash_explorer_with_icons.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_test_icon_extraction"
|
||||||
|
path = "examples/test_icon_extraction.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "gui_visual_node_prototype"
|
||||||
|
path = "development/egui_research/experiments/visual_node_prototype.rs"
|
||||||
|
required-features = ["gui-examples"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -90,11 +150,11 @@ wasm-bindgen = "0.2"
|
|||||||
console_error_panic_hook = "0.1"
|
console_error_panic_hook = "0.1"
|
||||||
js-sys = "0.3"
|
js-sys = "0.3"
|
||||||
|
|
||||||
# GUI フレームワーク
|
# GUI フレームワーク - only when gui feature is enabled
|
||||||
egui = "0.29"
|
egui = { version = "0.29", optional = true }
|
||||||
eframe = { version = "0.29", default-features = false, features = ["default_fonts", "glow"] }
|
eframe = { version = "0.29", default-features = false, features = ["default_fonts", "glow"], optional = true }
|
||||||
egui_extras = { version = "0.29", features = ["image"] }
|
egui_extras = { version = "0.29", features = ["image"], optional = true }
|
||||||
image = { version = "0.25", features = ["png", "ico"] }
|
image = { version = "0.25", features = ["png", "ico"], optional = true }
|
||||||
|
|
||||||
# Windows API
|
# Windows API
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
|||||||
13
local_tests/basic_math.nyash
Normal file
13
local_tests/basic_math.nyash
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Basic arithmetic test
|
||||||
|
local a, b, c, d, flag
|
||||||
|
a = 10
|
||||||
|
b = 20
|
||||||
|
c = a + b
|
||||||
|
print("10 + 20 = " + c)
|
||||||
|
|
||||||
|
d = c * 2
|
||||||
|
print("30 * 2 = " + d)
|
||||||
|
|
||||||
|
// Boolean test
|
||||||
|
flag = true
|
||||||
|
print("Flag is: " + flag)
|
||||||
12
local_tests/simple_hello.nyash
Normal file
12
local_tests/simple_hello.nyash
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Simple Hello World test
|
||||||
|
print("Hello, Nyash!")
|
||||||
|
|
||||||
|
local greeting
|
||||||
|
greeting = new StringBox("Welcome to Nyash!")
|
||||||
|
print(greeting.toString())
|
||||||
|
|
||||||
|
local numbers
|
||||||
|
numbers = new IntegerBox(42)
|
||||||
|
local result
|
||||||
|
result = numbers + 8
|
||||||
|
print("42 + 8 = " + result)
|
||||||
15
local_tests/static_main.nyash
Normal file
15
local_tests/static_main.nyash
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Static box Main pattern - current working syntax
|
||||||
|
static box Main {
|
||||||
|
init { console, result }
|
||||||
|
|
||||||
|
main() {
|
||||||
|
me.console = new ConsoleBox()
|
||||||
|
me.console.log("Hello from Static Main!")
|
||||||
|
|
||||||
|
local temp
|
||||||
|
temp = 42
|
||||||
|
me.result = temp
|
||||||
|
|
||||||
|
return "Main completed!"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,3 +1,5 @@
|
|||||||
|
#![cfg(feature = "gui")]
|
||||||
|
|
||||||
/*! 🖼️ EguiBox - デスクトップGUIアプリBox
|
/*! 🖼️ EguiBox - デスクトップGUIアプリBox
|
||||||
* Everything is Box哲学によるGUIフレームワーク統合
|
* Everything is Box哲学によるGUIフレームワーク統合
|
||||||
* 「なんでもBoxにできる」化け物言語の第一歩!
|
* 「なんでもBoxにできる」化け物言語の第一歩!
|
||||||
|
|||||||
@ -74,7 +74,7 @@ pub mod console_box;
|
|||||||
pub mod web;
|
pub mod web;
|
||||||
|
|
||||||
// GUI Box(条件付きコンパイル)
|
// GUI Box(条件付きコンパイル)
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
pub mod egui_box;
|
pub mod egui_box;
|
||||||
|
|
||||||
// 共通で使う型とトレイトを再エクスポート
|
// 共通で使う型とトレイトを再エクスポート
|
||||||
@ -95,7 +95,7 @@ pub use map_box::MapBox;
|
|||||||
pub use console_box::ConsoleBox;
|
pub use console_box::ConsoleBox;
|
||||||
|
|
||||||
// EguiBoxの再エクスポート(非WASM環境のみ)
|
// EguiBoxの再エクスポート(非WASM環境のみ)
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
pub use egui_box::EguiBox;
|
pub use egui_box::EguiBox;
|
||||||
|
|
||||||
// Web Box群の再エクスポート(WASM環境のみ)
|
// Web Box群の再エクスポート(WASM環境のみ)
|
||||||
|
|||||||
@ -144,7 +144,7 @@ impl NyashInterpreter {
|
|||||||
// DebugBox methods moved to system_methods.rs
|
// DebugBox methods moved to system_methods.rs
|
||||||
|
|
||||||
/// EguiBoxのメソッド呼び出しを実行(非WASM環境のみ)
|
/// EguiBoxのメソッド呼び出しを実行(非WASM環境のみ)
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
pub(super) fn execute_egui_method(&mut self, _egui_box: &crate::boxes::EguiBox, method: &str, arguments: &[ASTNode])
|
pub(super) fn execute_egui_method(&mut self, _egui_box: &crate::boxes::EguiBox, method: &str, arguments: &[ASTNode])
|
||||||
-> Result<Box<dyn NyashBox>, RuntimeError> {
|
-> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||||
// 引数を評価
|
// 引数を評価
|
||||||
|
|||||||
@ -459,7 +459,7 @@ impl NyashInterpreter {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// EguiBox method calls (非WASM環境のみ)
|
// EguiBox method calls (非WASM環境のみ)
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
if let Some(egui_box) = obj_value.as_any().downcast_ref::<crate::boxes::EguiBox>() {
|
if let Some(egui_box) = obj_value.as_any().downcast_ref::<crate::boxes::EguiBox>() {
|
||||||
return self.execute_egui_method(egui_box, method, arguments);
|
return self.execute_egui_method(egui_box, method, arguments);
|
||||||
}
|
}
|
||||||
@ -849,14 +849,19 @@ impl NyashInterpreter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 🔥 ビルトインBoxかチェック
|
// 🔥 ビルトインBoxかチェック
|
||||||
let is_builtin = matches!(parent,
|
let mut builtin_boxes = vec![
|
||||||
"IntegerBox" | "StringBox" | "BoolBox" | "ArrayBox" | "MapBox" |
|
"IntegerBox", "StringBox", "BoolBox", "ArrayBox", "MapBox",
|
||||||
"FileBox" | "ResultBox" | "FutureBox" | "ChannelBox" | "MathBox" |
|
"FileBox", "ResultBox", "FutureBox", "ChannelBox", "MathBox",
|
||||||
"TimeBox" | "DateTimeBox" | "TimerBox" | "RandomBox" | "SoundBox" |
|
"TimeBox", "DateTimeBox", "TimerBox", "RandomBox", "SoundBox",
|
||||||
"DebugBox" | "MethodBox" | "NullBox" | "ConsoleBox" | "FloatBox" |
|
"DebugBox", "MethodBox", "NullBox", "ConsoleBox", "FloatBox",
|
||||||
"BufferBox" | "RegexBox" | "JSONBox" | "StreamBox" | "HTTPClientBox" |
|
"BufferBox", "RegexBox", "JSONBox", "StreamBox", "HTTPClientBox",
|
||||||
"IntentBox" | "P2PBox" | "EguiBox"
|
"IntentBox", "P2PBox"
|
||||||
);
|
];
|
||||||
|
|
||||||
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
|
builtin_boxes.push("EguiBox");
|
||||||
|
|
||||||
|
let is_builtin = builtin_boxes.contains(&parent);
|
||||||
|
|
||||||
if is_builtin {
|
if is_builtin {
|
||||||
// ビルトインBoxの場合、ロックを解放してからメソッド呼び出し
|
// ビルトインBoxの場合、ロックを解放してからメソッド呼び出し
|
||||||
|
|||||||
@ -214,7 +214,7 @@ impl NyashInterpreter {
|
|||||||
// let p2p_box = Box::new(crate::boxes::P2PBox::new(node_id, intent_box)) as Box<dyn NyashBox>;
|
// let p2p_box = Box::new(crate::boxes::P2PBox::new(node_id, intent_box)) as Box<dyn NyashBox>;
|
||||||
// return Ok(p2p_box);
|
// return Ok(p2p_box);
|
||||||
// }
|
// }
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
"EguiBox" => {
|
"EguiBox" => {
|
||||||
// EguiBoxは引数なしで作成(GUIアプリケーション用)
|
// EguiBoxは引数なしで作成(GUIアプリケーション用)
|
||||||
if !arguments.is_empty() {
|
if !arguments.is_empty() {
|
||||||
@ -860,9 +860,9 @@ impl NyashInterpreter {
|
|||||||
let is_web_box = false;
|
let is_web_box = false;
|
||||||
|
|
||||||
// GUI専用Box(非WASM環境のみ)
|
// GUI専用Box(非WASM環境のみ)
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
let is_gui_box = matches!(type_name, "EguiBox");
|
let is_gui_box = matches!(type_name, "EguiBox");
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(not(all(feature = "gui", not(target_arch = "wasm32"))))]
|
||||||
let is_gui_box = false;
|
let is_gui_box = false;
|
||||||
|
|
||||||
is_builtin || is_web_box || is_gui_box ||
|
is_builtin || is_web_box || is_gui_box ||
|
||||||
@ -916,14 +916,19 @@ impl NyashInterpreter {
|
|||||||
// 親クラスの継承チェーンを再帰的に解決 (Multi-delegation) 🚀
|
// 親クラスの継承チェーンを再帰的に解決 (Multi-delegation) 🚀
|
||||||
for parent_name in &box_decl.extends {
|
for parent_name in &box_decl.extends {
|
||||||
// 🔥 ビルトインBoxかチェック
|
// 🔥 ビルトインBoxかチェック
|
||||||
let is_builtin = matches!(parent_name.as_str(),
|
let mut builtin_boxes = vec![
|
||||||
"IntegerBox" | "StringBox" | "BoolBox" | "ArrayBox" | "MapBox" |
|
"IntegerBox", "StringBox", "BoolBox", "ArrayBox", "MapBox",
|
||||||
"FileBox" | "ResultBox" | "FutureBox" | "ChannelBox" | "MathBox" |
|
"FileBox", "ResultBox", "FutureBox", "ChannelBox", "MathBox",
|
||||||
"TimeBox" | "DateTimeBox" | "TimerBox" | "RandomBox" | "SoundBox" |
|
"TimeBox", "DateTimeBox", "TimerBox", "RandomBox", "SoundBox",
|
||||||
"DebugBox" | "MethodBox" | "NullBox" | "ConsoleBox" | "FloatBox" |
|
"DebugBox", "MethodBox", "NullBox", "ConsoleBox", "FloatBox",
|
||||||
"BufferBox" | "RegexBox" | "JSONBox" | "StreamBox" | "HTTPClientBox" |
|
"BufferBox", "RegexBox", "JSONBox", "StreamBox", "HTTPClientBox",
|
||||||
"IntentBox" | "P2PBox" | "EguiBox"
|
"IntentBox", "P2PBox"
|
||||||
);
|
];
|
||||||
|
|
||||||
|
#[cfg(all(feature = "gui", not(target_arch = "wasm32")))]
|
||||||
|
builtin_boxes.push("EguiBox");
|
||||||
|
|
||||||
|
let is_builtin = builtin_boxes.contains(&parent_name.as_str());
|
||||||
|
|
||||||
if is_builtin {
|
if is_builtin {
|
||||||
// ビルトインBoxの場合、フィールドやメソッドは継承しない
|
// ビルトインBoxの場合、フィールドやメソッドは継承しない
|
||||||
|
|||||||
Reference in New Issue
Block a user