/*! * Nyash Rust Implementation - Everything is Box in Memory Safe Rust * * This is the main entry point for the Rust implementation of Nyash, * demonstrating the "Everything is Box" philosophy with Rust's ownership system. */ pub mod box_trait; pub mod boxes; pub mod environment; pub mod tokenizer; pub mod ast; pub mod parser; pub mod interpreter; pub mod instance; pub mod channel_box; pub mod finalization; pub mod exception_box; pub mod method_box; use box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox}; use environment::{Environment, PythonCompatEnvironment}; use tokenizer::{NyashTokenizer, TokenType}; use ast::ASTNode; use parser::NyashParser; use interpreter::NyashInterpreter; use std::env; use std::fs; use std::process; fn main() { let args: Vec = env::args().collect(); if args.len() > 1 { // File mode: parse and execute the provided .nyash file let filename = &args[1]; println!("๐Ÿฆ€ Nyash Rust Implementation - Executing file: {} ๐Ÿฆ€", filename); println!("===================================================="); execute_nyash_file(filename); } else { // Demo mode: run built-in demonstrations println!("๐Ÿฆ€ Nyash Rust Implementation - Everything is Box! ๐Ÿฆ€"); println!("===================================================="); // Demonstrate basic Box creation and operations demo_basic_boxes(); // Demonstrate Box operations demo_box_operations(); // Demonstrate Box collections demo_box_collections(); // Demonstrate Environment & Scope management demo_environment_system(); // Demonstrate Tokenizer system demo_tokenizer_system(); // Demonstrate Parser system demo_parser_system(); // Demonstrate Interpreter system demo_interpreter_system(); println!("\n๐ŸŽ‰ All Box operations completed successfully!"); println!("Memory safety guaranteed by Rust's borrow checker! ๐Ÿ›ก๏ธ"); } } fn execute_nyash_file(filename: &str) { // Read the file let code = match fs::read_to_string(filename) { Ok(content) => content, Err(e) => { eprintln!("โŒ Error reading file {}: {}", filename, e); process::exit(1); } }; println!("๐Ÿ“ File contents:\n{}", code); println!("\n๐Ÿš€ Parsing and executing...\n"); // Parse the code let ast = match NyashParser::parse_from_string(&code) { Ok(ast) => ast, Err(e) => { eprintln!("โŒ Parse error: {}", e); process::exit(1); } }; println!("โœ… Parse successful!"); // Execute the AST let mut interpreter = NyashInterpreter::new(); match interpreter.execute(ast) { Ok(result) => { println!("โœ… Execution completed successfully!"); println!("Result: {}", result.to_string_box().value); }, Err(e) => { // ๐Ÿ”ฅ Use enhanced error reporting with source context eprintln!("โŒ Runtime error:\n{}", e.detailed_message(Some(&code))); process::exit(1); } } } fn demo_basic_boxes() { println!("\n๐Ÿ“ฆ 1. Basic Box Creation:"); // Create basic boxes let string_box = StringBox::new("Hello from Rust!"); let integer_box = IntegerBox::new(42); let bool_box = BoolBox::new(true); let void_box = VoidBox::new(); println!(" StringBox: {} (ID: {})", string_box, string_box.box_id()); println!(" IntegerBox: {} (ID: {})", integer_box, integer_box.box_id()); println!(" BoolBox: {} (ID: {})", bool_box, bool_box.box_id()); println!(" VoidBox: {} (ID: {})", void_box, void_box.box_id()); // Test type identification println!("\n๐Ÿ” Type Information:"); println!(" StringBox type: {}", string_box.type_name()); println!(" IntegerBox type: {}", integer_box.type_name()); println!(" BoolBox type: {}", bool_box.type_name()); println!(" VoidBox type: {}", void_box.type_name()); } fn demo_box_operations() { println!("\nโšก 2. Box Operations:"); // Integer addition let left_int = Box::new(IntegerBox::new(10)) as Box; let right_int = Box::new(IntegerBox::new(32)) as Box; let int_add = AddBox::new(left_int, right_int); let int_result = int_add.execute(); println!(" Integer Addition: 10 + 32 = {}", int_result.to_string_box()); // String concatenation let left_str = Box::new(StringBox::new("Everything is ")) as Box; let right_str = Box::new(StringBox::new("Box in Rust!")) as Box; let str_add = AddBox::new(left_str, right_str); let str_result = str_add.execute(); println!(" String Concatenation: {}", str_result.to_string_box()); // Mixed type addition (falls back to string concatenation) let mixed_left = Box::new(StringBox::new("Answer: ")) as Box; let mixed_right = Box::new(IntegerBox::new(42)) as Box; let mixed_add = AddBox::new(mixed_left, mixed_right); let mixed_result = mixed_add.execute(); println!(" Mixed Addition: {}", mixed_result.to_string_box()); } fn demo_box_collections() { println!("\n๐Ÿ“š 3. Box Collections:"); // Create a collection of various boxes let mut box_collection: Vec> = Vec::new(); box_collection.push(Box::new(StringBox::new("First Box"))); box_collection.push(Box::new(IntegerBox::new(100))); box_collection.push(Box::new(BoolBox::new(false))); box_collection.push(Box::new(VoidBox::new())); println!(" Collection contents:"); for (i, box_item) in box_collection.iter().enumerate() { println!(" [{}] {} (Type: {}, ID: {})", i, box_item.to_string_box(), box_item.type_name(), box_item.box_id()); } // Test equality println!("\n๐Ÿ” Equality Testing:"); let test1 = StringBox::new("test"); let test2 = StringBox::new("test"); let test3 = StringBox::new("different"); println!(" \"test\" == \"test\": {}", test1.equals(&test2)); println!(" \"test\" == \"different\": {}", test1.equals(&test3)); } fn demo_environment_system() { println!("\n๐ŸŒ 4. Environment & Scope Management:"); // Create global environment let global_env = Environment::new_global(); println!(" Created global environment: {}", global_env.lock().unwrap().scope_info()); // Add global variables global_env.lock().unwrap().define("project_name", Box::new(StringBox::new("Nyash in Rust"))); global_env.lock().unwrap().define("version", Box::new(StringBox::new("v1.0-rust"))); global_env.lock().unwrap().define("debug_mode", Box::new(BoolBox::new(true))); println!(" Global variables: {:?}", global_env.lock().unwrap().list_variables()); // Create function scope let function_env = Environment::new_child(global_env.clone(), "test_function"); println!(" Created function scope: {}", function_env.lock().unwrap().scope_info()); // Add local variables function_env.lock().unwrap().define("local_var", Box::new(IntegerBox::new(42))); function_env.lock().unwrap().define("temp_result", Box::new(StringBox::new("processing..."))); // Test variable access from child scope println!("\n ๐Ÿ” Variable Access Tests:"); // Access global variable from function scope match function_env.lock().unwrap().get("project_name") { Ok(value) => println!(" Access global from function: {}", value.to_string_box()), Err(e) => println!(" Error: {}", e), } // Access local variable match function_env.lock().unwrap().get("local_var") { Ok(value) => println!(" Access local variable: {}", value.to_string_box()), Err(e) => println!(" Error: {}", e), } // Try to access local variable from global (should fail) match global_env.lock().unwrap().get("local_var") { Ok(value) => println!(" Unexpected access to local from global: {}", value.to_string_box()), Err(e) => println!(" โœ… Correctly blocked access to local from global: {}", e), } // Test variable setting (modification) println!("\n ๐Ÿ”ง Variable Modification Tests:"); // Modify global variable from function scope let _ = function_env.lock().unwrap().set("version", Box::new(StringBox::new("v1.1-rust-updated"))); // Check if global was updated let updated_version = global_env.lock().unwrap().get("version").unwrap(); println!(" Updated global variable: {}", updated_version.to_string_box()); // Create nested scope (function inside function) let nested_env = Environment::new_child(function_env.clone(), "nested_function"); nested_env.lock().unwrap().define("nested_var", Box::new(BoolBox::new(false))); // Test scope chain println!("\n ๐Ÿ“Š Scope Chain Analysis:"); let scope_chain = nested_env.lock().unwrap().scope_chain_info(); for (i, scope_info) in scope_chain.iter().enumerate() { println!(" Level {}: {}", i, scope_info); } // Test variable shadowing println!("\n ๐ŸŒ‘ Variable Shadowing Test:"); function_env.lock().unwrap().define("debug_mode", Box::new(BoolBox::new(false))); // Shadow global let global_debug = global_env.lock().unwrap().get("debug_mode").unwrap(); let function_debug = function_env.lock().unwrap().get("debug_mode").unwrap(); println!(" Global debug_mode: {}", global_debug.to_string_box()); println!(" Function debug_mode (shadowed): {}", function_debug.to_string_box()); // Test Python compatibility layer println!("\n ๐Ÿ Python Compatibility Layer:"); let mut python_env = PythonCompatEnvironment::new(); python_env.define("py_var", Box::new(StringBox::new("python_style"))); let py_value = python_env.get("py_var"); println!(" Python-style access: {}", py_value.to_string_box()); println!(" _bindings contains: {:?}", python_env._bindings.keys().collect::>()); // Dump all variables for debugging println!("\n ๐Ÿ“‹ Complete Variable Dump:"); let all_vars = nested_env.lock().unwrap().dump_all_variables(); for (qualified_name, value) in all_vars { println!(" {}: {}", qualified_name, value); } } fn demo_tokenizer_system() { println!("\n๐Ÿ”ค 5. Tokenizer System:"); // Test simple tokens println!(" ๐Ÿ“ Simple Token Test:"); let simple_code = "box TestBox { value }"; let mut tokenizer = NyashTokenizer::new(simple_code); match tokenizer.tokenize() { Ok(tokens) => { println!(" Input: {}", simple_code); println!(" Tokens:"); for (i, token) in tokens.iter().enumerate() { if matches!(token.token_type, TokenType::EOF) { break; // EOF ใฏ่กจ็คบใ—ใชใ„ } println!(" [{}] {:?} at line {}, column {}", i, token.token_type, token.line, token.column); } } Err(e) => println!(" Error: {}", e), } // Test complex code (same as debug_this_problem.nyash) println!("\n ๐Ÿš€ Complex Code Test:"); let complex_code = r#" // thisๅ•้กŒใฎใƒŸใƒ‹ใƒžใƒซๅ†็พ box TestBox { value getValue() { return this.value } } // ใƒ†ใ‚นใƒˆ obj = new TestBox() obj.value = "test123" print("Direct field: " + obj.value) print("Method call: " + obj.getValue()) "#; let mut complex_tokenizer = NyashTokenizer::new(complex_code); match complex_tokenizer.tokenize() { Ok(tokens) => { let non_eof_tokens: Vec<_> = tokens.iter() .filter(|t| !matches!(t.token_type, TokenType::EOF)) .collect(); println!(" Successfully tokenized {} tokens", non_eof_tokens.len()); // Show first 10 tokens println!(" First 10 tokens:"); for (i, token) in non_eof_tokens.iter().take(10).enumerate() { println!(" [{}] {:?}", i, token.token_type); } // Count token types let mut token_counts = std::collections::HashMap::new(); for token in &non_eof_tokens { let type_name = match &token.token_type { TokenType::IDENTIFIER(_) => "IDENTIFIER", TokenType::STRING(_) => "STRING", TokenType::NUMBER(_) => "NUMBER", TokenType::BOX => "BOX", TokenType::NEW => "NEW", TokenType::THIS => "THIS", TokenType::RETURN => "RETURN", TokenType::PRINT => "PRINT", TokenType::DOT => "DOT", TokenType::ASSIGN => "ASSIGN", TokenType::PLUS => "PLUS", TokenType::LPAREN => "LPAREN", TokenType::RPAREN => "RPAREN", TokenType::LBRACE => "LBRACE", TokenType::RBRACE => "RBRACE", _ => "OTHER", }; *token_counts.entry(type_name).or_insert(0) += 1; } println!(" Token type counts:"); for (type_name, count) in token_counts { println!(" {}: {}", type_name, count); } } Err(e) => println!(" Error: {}", e), } // Test string literals and escapes println!("\n ๐Ÿ“ String Literal Test:"); let string_code = r#""Hello, World!" "Line 1\nLine 2" "Tab\tSeparated""#; let mut string_tokenizer = NyashTokenizer::new(string_code); match string_tokenizer.tokenize() { Ok(tokens) => { for token in tokens.iter() { if let TokenType::STRING(s) = &token.token_type { println!(" String: {:?}", s); } } } Err(e) => println!(" Error: {}", e), } // Test numbers println!("\n ๐Ÿ”ข Number Test:"); let number_code = "42 0 123 999"; let mut number_tokenizer = NyashTokenizer::new(number_code); match number_tokenizer.tokenize() { Ok(tokens) => { for token in tokens.iter() { if let TokenType::NUMBER(n) = &token.token_type { println!(" Number: {}", n); } } } Err(e) => println!(" Error: {}", e), } // Test error handling println!("\n โŒ Error Handling Test:"); let error_code = "box test @#$%"; let mut error_tokenizer = NyashTokenizer::new(error_code); match error_tokenizer.tokenize() { Ok(_) => println!(" Unexpected success"), Err(e) => println!(" Expected error: {}", e), } } fn demo_parser_system() { println!("\n๐ŸŒณ 6. Parser & AST System:"); // Test simple box declaration println!(" ๐Ÿ“ Simple Box Declaration Test:"); let simple_code = r#" box TestBox { value getValue() { return this.value } } "#; match NyashParser::parse_from_string(simple_code) { Ok(ast) => { println!(" Input: {}", simple_code.trim()); println!(" AST: {}", ast); if let ASTNode::Program { statements, .. } = &ast { println!(" Program has {} statements", statements.len()); for (i, stmt) in statements.iter().enumerate() { println!(" [{}] {}", i, stmt.info()); } } } Err(e) => println!(" Error: {}", e), } // Test assignment and method call println!("\n ๐Ÿš€ Assignment & Method Call Test:"); let assignment_code = r#" obj = new TestBox() obj.value = "test123" print("Direct field: " + obj.value) print("Method call: " + obj.getValue()) "#; match NyashParser::parse_from_string(assignment_code) { Ok(ast) => { println!(" Successfully parsed assignment & method call code"); if let ASTNode::Program { statements, .. } = &ast { println!(" Parsed {} statements:", statements.len()); for (i, stmt) in statements.iter().enumerate() { println!(" [{}] {} ({})", i, stmt.info(), stmt.node_type()); } } } Err(e) => println!(" Error: {}", e), } // Test expression parsing println!("\n โšก Expression Parsing Test:"); let expr_code = r#" result = x + y * z condition = a == b && c < d "#; match NyashParser::parse_from_string(expr_code) { Ok(ast) => { println!(" Successfully parsed complex expressions"); if let ASTNode::Program { statements, .. } = &ast { for (i, stmt) in statements.iter().enumerate() { if let ASTNode::Assignment { target, value, .. } = stmt { println!(" Assignment [{}]: {} = {}", i, target.info(), value.info()); } } } } Err(e) => println!(" Error: {}", e), } // Test control structures println!("\n ๐Ÿ”„ Control Structure Test:"); let control_code = r#" if condition { print("True branch") } else { print("False branch") } loop { print("Loop body") return } "#; match NyashParser::parse_from_string(control_code) { Ok(ast) => { println!(" Successfully parsed control structures"); if let ASTNode::Program { statements, .. } = &ast { for (i, stmt) in statements.iter().enumerate() { println!(" [{}] {} ({})", i, stmt.info(), stmt.node_type()); } } } Err(e) => println!(" Error: {}", e), } // Test the debug_this_problem.nyash equivalent println!("\n ๐Ÿ› Debug This Problem Test (Rust Parser):"); let debug_code = r#" // thisๅ•้กŒใฎใƒŸใƒ‹ใƒžใƒซๅ†็พ box TestBox { value getValue() { return this.value } } // ใƒ†ใ‚นใƒˆ obj = new TestBox() obj.value = "test123" print("Direct field: " + obj.value) print("Method call: " + obj.getValue()) "#; match NyashParser::parse_from_string(debug_code) { Ok(ast) => { println!(" โœ… Successfully parsed debug_this_problem equivalent!"); if let ASTNode::Program { statements, .. } = &ast { println!(" Complete program structure:"); println!(" Total statements: {}", statements.len()); let mut box_count = 0; let mut assignment_count = 0; let mut print_count = 0; let mut method_calls = 0; for stmt in statements { match stmt { ASTNode::BoxDeclaration { .. } => box_count += 1, ASTNode::Assignment { .. } => assignment_count += 1, ASTNode::Print { .. } => print_count += 1, _ => {} } // Count method calls recursively count_method_calls(stmt, &mut method_calls); } println!(" - Box declarations: {}", box_count); println!(" - Assignments: {}", assignment_count); println!(" - Print statements: {}", print_count); println!(" - Method calls found: {}", method_calls); println!(" ๐ŸŽฏ Parser successfully handles 'this' context in AST!"); } } Err(e) => println!(" โŒ Parse error: {}", e), } } // Helper function to count method calls recursively fn count_method_calls(node: &ASTNode, count: &mut usize) { match node { ASTNode::MethodCall { .. } => { *count += 1; } ASTNode::Program { statements, .. } => { for stmt in statements { count_method_calls(stmt, count); } } ASTNode::Assignment { target, value, .. } => { count_method_calls(target, count); count_method_calls(value, count); } ASTNode::Print { expression, .. } => { count_method_calls(expression, count); } ASTNode::BinaryOp { left, right, .. } => { count_method_calls(left, count); count_method_calls(right, count); } ASTNode::BoxDeclaration { methods, .. } => { for method in methods.values() { count_method_calls(method, count); } } ASTNode::FunctionDeclaration { body, .. } => { for stmt in body { count_method_calls(stmt, count); } } ASTNode::Return { value, .. } => { if let Some(val) = value { count_method_calls(val, count); } } _ => {} } } fn demo_interpreter_system() { println!("\n๐Ÿš€ 7. Interpreter & Execution System:"); // Test simple variable assignment and print println!(" ๐Ÿ“ Simple Assignment & Print Test:"); let simple_code = r#" x = 42 y = "Hello, Nyash!" print(x) print(y) "#; match NyashParser::parse_from_string(simple_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Code: {}", simple_code.trim()); println!(" Output:"); match interpreter.execute(ast) { Ok(_) => println!(" โœ… Execution successful!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test arithmetic operations println!("\n โšก Arithmetic Operations Test:"); let arithmetic_code = r#" a = 10 b = 32 result = a + b print("10 + 32 = " + result) "#; match NyashParser::parse_from_string(arithmetic_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing arithmetic operations..."); match interpreter.execute(ast) { Ok(_) => println!(" โœ… Arithmetic execution successful!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test if statements println!("\n ๐Ÿ”„ Control Flow (If) Test:"); let if_code = r#" condition = true if condition { print("Condition was true!") result = "success" } else { print("Condition was false!") result = "failure" } print("Result: " + result) "#; match NyashParser::parse_from_string(if_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing if statement..."); match interpreter.execute(ast) { Ok(_) => println!(" โœ… If statement execution successful!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test AND/OR operators println!("\n ๐Ÿ”— Logical Operators Test:"); let logic_code = r#" a = true b = false result1 = a && b result2 = a || b print("true && false = " + result1) print("true || false = " + result2) "#; match NyashParser::parse_from_string(logic_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing logical operators..."); match interpreter.execute(ast) { Ok(_) => println!(" โœ… Logical operators execution successful!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test loop with break println!("\n ๐Ÿ” Loop with Break Test:"); let loop_code = r#" counter = 0 loop { counter = counter + 1 print("Loop iteration: " + counter) if counter == 3 { print("Breaking loop!") break } } print("Final counter: " + counter) "#; match NyashParser::parse_from_string(loop_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing loop with break..."); match interpreter.execute(ast) { Ok(_) => println!(" โœ… Loop execution successful!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test Box declaration and instance creation println!("\n ๐Ÿ“ฆ Box Declaration & Instance Test:"); let box_code = r#" box TestBox { value getValue() { return this.value } setValue(newValue) { this.value = newValue } } // Create instance obj = new TestBox() print("Created TestBox instance: " + obj) // Set field directly obj.value = "test123" print("Set field directly: obj.value = " + obj.value) // Call method that uses this result = obj.getValue() print("Method call result: " + result) // Call method that modifies via this obj.setValue("modified value") print("After setValue: " + obj.value) "#; match NyashParser::parse_from_string(box_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Testing Box instances with 'this' binding..."); match interpreter.execute(ast) { Ok(_) => println!(" โœ… Box instance & 'this' working correctly!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test global variable println!("\n ๐ŸŒ Global Variable Test:"); let global_code = r#" global project_name = "Nyash in Rust" global version = "v1.0" print("Project: " + project_name) print("Version: " + version) "#; match NyashParser::parse_from_string(global_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Setting global variables..."); match interpreter.execute(ast) { Ok(_) => println!(" โœ… Global variables successful!"), Err(e) => println!(" โŒ Runtime error: {}", e), } } Err(e) => println!(" โŒ Parse error: {}", e), } // Test Self-Hosting Demonstration println!("\n ๐ŸŽ† SELF-HOSTING DEMONSTRATION ๐ŸŽ†:"); println!(" Loading self-hosting test file..."); match std::fs::read_to_string("test_self_hosting_simple.nyash") { Ok(self_hosting_code) => { match NyashParser::parse_from_string(&self_hosting_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing self-hosting simulation..."); match interpreter.execute(ast) { Ok(_) => { println!(" ๐Ÿš€ LEGENDARY ACHIEVEMENT UNLOCKED! ๐Ÿš€"); println!(" Rust-based Nyash interpreter successfully executed"); println!(" Nyash code that simulates compiling other Nyash code!"); println!(" Self-hosting level: ULTIMATE META-PROGRAMMING! ๐ŸŽ†"); }, Err(e) => println!(" โŒ Self-hosting runtime error: {}", e), } } Err(e) => println!(" โŒ Self-hosting parse error: {}", e), } } Err(_) => { println!(" โš ๏ธ test_self_hosting_simple.nyash not found, using inline test:"); let inline_self_hosting = r#" print("๐ŸŽ† Inline Self-Hosting Test ๐ŸŽ†") box MetaCompiler { name init(compilerName) { this.name = compilerName } compile(code) { return "Compiled by " + this.name + ": " + code } } meta = new MetaCompiler() meta.init("Nyash-in-Rust") result = meta.compile("Everything is Box!") print(result) print("๐Ÿš€ Meta-compilation successful!") "#; match NyashParser::parse_from_string(inline_self_hosting) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); match interpreter.execute(ast) { Ok(_) => println!(" ๐ŸŽ† Inline self-hosting successful! ๐ŸŽ†"), Err(e) => println!(" โŒ Inline self-hosting error: {}", e), } } Err(e) => println!(" โŒ Inline self-hosting parse error: {}", e), } } } // Test Interface Box Implementation println!("\n ๐ŸŽ† INTERFACE BOX IMPLEMENTATION TEST ๐ŸŽ†:"); println!(" Testing interface box syntax support..."); match std::fs::read_to_string("test_interface.nyash") { Ok(interface_code) => { match NyashParser::parse_from_string(&interface_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing interface box test..."); match interpreter.execute(ast) { Ok(_) => { println!(" ๐Ÿš€ INTERFACE BOX STEP 1 SUCCESS! ๐Ÿš€"); println!(" โœ… interface box syntax parsing works!"); println!(" โœ… Interface registration successful!"); println!(" Next: extends and implements syntax..."); }, Err(e) => println!(" โŒ Interface runtime error: {}", e), } } Err(e) => println!(" โŒ Interface parse error: {}", e), } } Err(_) => { println!(" โš ๏ธ test_interface.nyash not found, using inline test:"); let inline_interface_test = r#" print("๐ŸŽ† Inline Interface Test ๐ŸŽ†") interface box Testable { test() verify(result) } print("Interface box declared successfully!") print("โœ… Step 1: interface box syntax - WORKING!") "#; match NyashParser::parse_from_string(inline_interface_test) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); match interpreter.execute(ast) { Ok(_) => println!(" ๐ŸŽ† Interface syntax working! ๐ŸŽ†"), Err(e) => println!(" โŒ Interface test error: {}", e), } } Err(e) => println!(" โŒ Interface test parse error: {}", e), } } } // Test Inheritance Implementation println!("\n ๐Ÿš€ INHERITANCE IMPLEMENTATION TEST ๐Ÿš€:"); println!(" Testing extends & implements syntax..."); match std::fs::read_to_string("test_inheritance.nyash") { Ok(inheritance_code) => { match NyashParser::parse_from_string(&inheritance_code) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); println!(" Executing inheritance test..."); match interpreter.execute(ast) { Ok(_) => { println!(" ๐ŸŽ† INHERITANCE STEPS 2&3 SUCCESS! ๐ŸŽ†"); println!(" โœ… extends syntax working!"); println!(" โœ… implements syntax working!"); println!(" โœ… Inheritance chain resolution!"); println!(" โœ… Interface validation!"); println!(" โœ… Method overriding!"); }, Err(e) => println!(" โŒ Inheritance runtime error: {}", e), } } Err(e) => println!(" โŒ Inheritance parse error: {}", e), } } Err(_) => { println!(" โš ๏ธ test_inheritance.nyash not found, using inline test:"); let inline_inheritance_test = r#" print("๐Ÿš€ Inline Inheritance Test ๐Ÿš€") interface box Speakable { speak() } box Animal { name speak() { return "Animal sound" } } box Dog extends Animal implements Speakable { breed speak() { return "Woof!" } } dog = new Dog() dog.name = "Buddy" dog.breed = "Labrador" print("Dog says: " + dog.speak()) print("โœ… Inheritance working!") "#; match NyashParser::parse_from_string(inline_inheritance_test) { Ok(ast) => { let mut interpreter = NyashInterpreter::new(); match interpreter.execute(ast) { Ok(_) => println!(" ๐Ÿš€ Inheritance test successful! ๐Ÿš€"), Err(e) => println!(" โŒ Inheritance test error: {}", e), } } Err(e) => println!(" โŒ Inheritance test parse error: {}", e), } } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_main_functionality() { // This test ensures main() doesn't panic // In a real implementation, we'd have more comprehensive tests let string_box = StringBox::new("test"); assert_eq!(string_box.type_name(), "StringBox"); assert_eq!(string_box.to_string_box().value, "test"); } }