Files
hakorune/src/interpreter/methods/io_methods.rs
2025-08-11 20:32:25 +00:00

108 lines
4.4 KiB
Rust

/*!
* I/O Operations Box Methods Module
*
* Extracted from box_methods.rs
* Contains method implementations for I/O and error handling operations:
* - FileBox (execute_file_method) - File I/O operations
* - ResultBox (execute_result_method) - Error handling and result operations
*/
use super::super::*;
use crate::box_trait::{ResultBox, StringBox, NyashBox};
use crate::boxes::FileBox;
impl NyashInterpreter {
/// FileBoxのメソッド呼び出しを実行
/// Handles file I/O operations including read, write, exists, delete, and copy
pub(in crate::interpreter) fn execute_file_method(&mut self, file_box: &FileBox, method: &str, arguments: &[ASTNode])
-> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
"read" => {
if !arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: format!("read() expects 0 arguments, got {}", arguments.len()),
});
}
Ok(file_box.read())
}
"write" => {
if arguments.len() != 1 {
return Err(RuntimeError::InvalidOperation {
message: format!("write() expects 1 argument, got {}", arguments.len()),
});
}
let content = self.execute_expression(&arguments[0])?;
Ok(file_box.write(content))
}
"exists" => {
if !arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: format!("exists() expects 0 arguments, got {}", arguments.len()),
});
}
Ok(file_box.exists())
}
"delete" => {
if !arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: format!("delete() expects 0 arguments, got {}", arguments.len()),
});
}
Ok(file_box.delete())
}
"copy" => {
if arguments.len() != 1 {
return Err(RuntimeError::InvalidOperation {
message: format!("copy() expects 1 argument, got {}", arguments.len()),
});
}
let dest_value = self.execute_expression(&arguments[0])?;
if let Some(dest_str) = dest_value.as_any().downcast_ref::<StringBox>() {
Ok(file_box.copy(&dest_str.value))
} else {
Err(RuntimeError::TypeError {
message: "copy() requires string destination path".to_string(),
})
}
}
_ => Err(RuntimeError::InvalidOperation {
message: format!("Unknown method '{}' for FileBox", method),
})
}
}
/// ResultBoxのメソッド呼び出しを実行
/// Handles result/error checking operations for error handling patterns
pub(in crate::interpreter) fn execute_result_method(&mut self, result_box: &ResultBox, method: &str, arguments: &[ASTNode])
-> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
"isOk" => {
if !arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: format!("isOk() expects 0 arguments, got {}", arguments.len()),
});
}
Ok(result_box.is_ok())
}
"getValue" => {
if !arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: format!("getValue() expects 0 arguments, got {}", arguments.len()),
});
}
Ok(result_box.get_value())
}
"getError" => {
if !arguments.is_empty() {
return Err(RuntimeError::InvalidOperation {
message: format!("getError() expects 0 arguments, got {}", arguments.len()),
});
}
Ok(result_box.get_error())
}
_ => Err(RuntimeError::InvalidOperation {
message: format!("Unknown method '{}' for ResultBox", method),
})
}
}
}