Files
hakorune/src/boxes/console_box.rs
nyash-codex e328be0307 Phase 122.5-126完了:ConsoleBox 品質改善・最適化・統合
## 実装成果(Phase 122.5-126)

### Phase 122.5: nyash.toml method_id 修正
- println method_id を 2 → 1 に統一(log と同じ)
- TypeRegistry slot 400 との整合性確保

### Phase 123: ConsoleBox WASM/非WASM コード統一化
- マクロ define_console_impl! による重複排除
- 67行削減(27.3% 削減達成)
- ビルド成功・全テストパス

### Phase 124: VM Method Dispatch 統一化
- TypeRegistry ベースの統一ディスパッチ (dispatch_by_slot)
- String/Array/ConsoleBox を一元化
- 100行削減、メソッド解決の高速化

### Phase 125: 削除:deprecated builtin ConsoleBox
- src/box_factory/builtin_impls/console_box.rs 削除
- Plugin-only 移行で "Everything is Plugin" 実現
- 52行削減

### Phase 126: ドキュメント統合
- consolebox_complete_guide.md (27KB統合マスター)
- core_boxes_design/logging_policy/hako_logging_design 更新
- ~750行の navigation・cross-reference 改善

## 数値成果

- **総コード削減**: 219行
- **新規ドキュメント**: 1ファイル (+27KB)
- **更新ドキュメント**: 6ファイル (+~750行)
- **テスト**: Phase 120 representative tests  PASS
- **ビルド**: Zero errors

## 設計原則の完全実現

 println/log エイリアス統一(Phase 122)
 WASM/非WASM 統一化(Phase 123)
 TypeRegistry 統合(Phase 124)
 Plugin-only 移行(Phase 125)
 ドキュメント統合(Phase 126)

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 06:02:03 +09:00

179 lines
5.1 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*! 📟 ConsoleBox - コンソール出力Box
*
* ## 📝 概要
* Webブラウザのコンソール機能を統合したBox。
* WASM環境ではブラウザコンソール、ネイティブ環境では標準出力。
*
* ## 🛠️ 利用可能メソッド
* - `log(message)` - 通常のメッセージ出力
* - `println(message)` - `log` のエイリアス(ユーザー向け sugar
* - `warn(message)` - 警告メッセージ出力
* - `error(message)` - エラーメッセージ出力
* - `clear()` - コンソール画面クリア
*
* ## Phase 122: println / log の統一
*
* `println` は `log` の完全なエイリアスです。内部的には同じ slot 400 を使用します。
* ユーザーコードでは `println` を使用することを推奨しますが、`log` も同様に動作します。
*
* ## 💡 使用例
* ```nyash
* local console
* console = new ConsoleBox()
*
* console.log("Hello, Nyash!") // 通常ログ
* console.warn("This is a warning") // 警告
* console.error("Something went wrong") // エラー
* console.clear() // クリア
*
* // デバッグ用途
* local value
* value = 42
* console.log("Debug: value = " + value.toString())
* ```
*
* ## 🌐 環境別動作
* - **WASM環境**: ブラウザの開発者ツールコンソールに出力
* - **ネイティブ環境**: ターミナル標準出力にプレフィックス付きで出力
*
* ## 🔍 デバッグ活用
* ```nyash
* // エラーハンドリング
* if (error_condition) {
* console.error("Critical error occurred!")
* return null
* }
*
* // 実行トレース
* console.log("Function start")
* // 処理...
* console.log("Function end")
* ```
*/
use crate::box_trait::{BoolBox, BoxBase, BoxCore, NyashBox, StringBox};
use std::any::Any;
use std::fmt::Display;
/// ConsoleBox メソッド実装マクロ
/// WASM/非WASM環境で異なるメソッド実装を統一化
macro_rules! define_console_impl {
(
log: $log_impl:expr,
warn: $warn_impl:expr,
error: $error_impl:expr,
clear: $clear_impl:expr,
fmt_desc: $fmt_desc:expr
) => {
impl ConsoleBox {
pub fn new() -> Self {
Self {
base: BoxBase::new(),
}
}
pub fn log(&self, message: &str) {
$log_impl(message);
}
pub fn println(&self, message: &str) {
self.log(message);
}
pub fn warn(&self, message: &str) {
$warn_impl(message);
}
pub fn error(&self, message: &str) {
$error_impl(message);
}
pub fn clear(&self) {
$clear_impl();
}
}
impl BoxCore for ConsoleBox {
fn box_id(&self) -> u64 {
self.base.id
}
fn parent_type_id(&self) -> Option<std::any::TypeId> {
self.base.parent_type_id
}
fn fmt_box(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", $fmt_desc)
}
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
impl NyashBox for ConsoleBox {
fn to_string_box(&self) -> StringBox {
StringBox::new($fmt_desc)
}
fn equals(&self, other: &dyn NyashBox) -> BoolBox {
BoolBox::new(other.as_any().is::<ConsoleBox>())
}
fn type_name(&self) -> &'static str {
"ConsoleBox"
}
fn clone_box(&self) -> Box<dyn NyashBox> {
Box::new(self.clone())
}
fn share_box(&self) -> Box<dyn NyashBox> {
self.clone_box()
}
}
impl Display for ConsoleBox {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.fmt_box(f)
}
}
};
}
// 🌐 Browser console access Box
#[cfg(target_arch = "wasm32")]
#[derive(Debug, Clone)]
pub struct ConsoleBox {
base: BoxBase,
}
#[cfg(target_arch = "wasm32")]
define_console_impl!(
log: |msg: &str| { web_sys::console::log_1(&msg.into()); },
warn: |msg: &str| { web_sys::console::warn_1(&msg.into()); },
error: |msg: &str| { web_sys::console::error_1(&msg.into()); },
clear: || { web_sys::console::clear(); },
fmt_desc: "[ConsoleBox - Browser Console Interface]"
);
// Non-WASM版 - モックアップ実装
#[cfg(not(target_arch = "wasm32"))]
#[derive(Debug, Clone)]
pub struct ConsoleBox {
base: BoxBase,
}
#[cfg(not(target_arch = "wasm32"))]
define_console_impl!(
log: |msg: &str| { println!("[Console LOG] {}", msg); },
warn: |msg: &str| { println!("[Console WARN] {}", msg); },
error: |msg: &str| { println!("[Console ERROR] {}", msg); },
clear: || { println!("[Console CLEAR]"); },
fmt_desc: "[ConsoleBox - Mock Implementation]"
);