Skip to content

Commit eb6dab3

Browse files
Add a run subcommand (#14)
* Make assembler callable programmatically * + * trying to get ExecuteLegacy work as a default subcommand * Give up on ExecuteLegacy * Rename Commands enum * "rustyman run" is nearly ready * Work on putting machine code straight to RAM * Finish `rustyman run` --------- Co-authored-by: MMK21 <50421330+MMK21Hub@users.noreply.github.com>
1 parent 4cb3415 commit eb6dab3

6 files changed

Lines changed: 252 additions & 47 deletions

File tree

Cargo.lock

Lines changed: 141 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ homepage = "https://github.com/RandomSearch18/rusty_man_computer#readme"
1313

1414
[dependencies]
1515
clap = { version = "4.5.30", features = ["derive"] }
16+
color-eyre = { version = "0.6", default-features = false }
17+
thiserror = "2.0.17"
1618

1719
[[bin]]
1820
name = "bin_creator"
1921
path = "src/bin_creator.rs"
2022

2123
[[bin]]
2224
name = "rmc_assemble"
23-
path = "src/rmc_assemble.rs"
25+
path = "src/assembler.rs"
Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use clap::Parser;
22
use std::{collections::HashMap, fmt, fs, io, path::PathBuf};
3+
use thiserror::Error;
34

45
use rusty_man_computer::value::Value;
56

@@ -55,7 +56,7 @@ impl fmt::Display for ParseErrorType {
5556
}
5657

5758
#[derive(Debug)]
58-
struct ParseError {
59+
pub struct ParseError {
5960
error: ParseErrorType,
6061
line: usize,
6162
}
@@ -206,10 +207,15 @@ fn generate_machine_code(lines: Vec<Line>) -> Result<Vec<Value>, &'static str> {
206207
Ok(output)
207208
}
208209

209-
enum AssemblerError {
210+
#[derive(Error)]
211+
pub enum AssemblerError {
212+
#[error("{0}")]
210213
ParseError(ParseError),
214+
#[error("Machine code error: {0}")]
211215
MachineCodeError(&'static str),
216+
#[error("Failed to read input file: {0}")]
212217
ReadError(io::Error),
218+
#[error("Failed to write to output file: {0}")]
213219
WriteError(io::Error),
214220
}
215221

@@ -224,7 +230,7 @@ impl fmt::Debug for AssemblerError {
224230
}
225231
}
226232

227-
fn assemble(program: &str) -> Result<Vec<Value>, AssemblerError> {
233+
pub fn assemble(program: &str) -> Result<Vec<Value>, AssemblerError> {
228234
let parsed = parse_assembly(program);
229235
let mut valid_lines: Vec<Line> = Vec::new();
230236
// Only go forward with non-empty lines, and raise an error if we encounter an invalid line
@@ -254,8 +260,7 @@ pub struct Args {
254260
output: PathBuf,
255261
}
256262

257-
fn main() -> Result<(), AssemblerError> {
258-
let args = Args::parse();
263+
fn assemble_from_file(args: Args) -> Result<(), AssemblerError> {
259264
let program =
260265
std::fs::read_to_string(args.program).map_err(|e| AssemblerError::ReadError(e))?;
261266
let assembler_result = assemble(&program);
@@ -269,6 +274,11 @@ fn main() -> Result<(), AssemblerError> {
269274
}
270275
}
271276

277+
fn main() -> Result<(), AssemblerError> {
278+
let args = Args::parse();
279+
assemble_from_file(args)
280+
}
281+
272282
#[cfg(test)]
273283
mod tests {
274284
use super::*;

0 commit comments

Comments
 (0)