From c949adeed95e134d569b8381d5f483a218159ece Mon Sep 17 00:00:00 2001 From: Raymonzut Date: Wed, 20 Oct 2021 21:46:19 +0200 Subject: [PATCH] Extract IO out of instruct - Attach fail case only once on main --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/main.rs | 23 ++++++++++++++--------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb6f0d0..ed15199 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,6 +149,7 @@ dependencies = [ "anyhow", "pest", "pest_derive", + "string-builder", "structopt", ] @@ -255,6 +256,12 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "string-builder" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd10a070fb1f2796a288abec42695db4682a82b6f12ffacd60fb8d5ad3a4a12" + [[package]] name = "strsim" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 17ec520..107b84c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" [dependencies] anyhow = "1.0.44" +string-builder = "0.2.0" pest = "2.1.3" pest_derive = "2.1.0" structopt = "0.3.23" diff --git a/src/main.rs b/src/main.rs index b47f09b..5f50e98 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use std::fs::File; use std::io::Write; use anyhow::{Context, Result}; +use string_builder::Builder; use structopt::StructOpt; extern crate pest; @@ -23,19 +24,19 @@ struct Cli { output_file: std::path::PathBuf, } -fn instruct(statement: Pair, mut out: &File) { +fn instruct(statement: Pair, out: &mut Builder) { match statement.as_rule() { Rule::instruction => { for nested_statement in statement.into_inner() { instruct(nested_statement, out); } - out.write(b"\n"); + out.append("\n"); } Rule::operator => { - out.write(b"operator "); + out.append("operator "); } Rule::operand => { - out.write(b"operand "); + out.append("operand "); } Rule::loopBlock => { @@ -44,13 +45,13 @@ fn instruct(statement: Pair, mut out: &File) { } } Rule::loopBlockStart => { - out.write(b"loopBlockStart\n"); + out.append("loopBlockStart\n"); } Rule::loopBlockEnd => { - out.write(b"loopBlockEnd\n"); + out.append("loopBlockEnd\n"); } Rule::EOI => { - out.write(b"\n"); + out.append("\n"); } _ => unreachable!(), } @@ -62,7 +63,7 @@ fn main() -> Result<(), Box> { let content = std::fs::read_to_string(&args.input_file) .with_context(|| format!("could not read source file {:?}", args.input_file))?; - let out = File::create(args.output_file)?; + let mut builder = Builder::default(); let parsed_file = MblfParser::parse(Rule::file, &content) .expect("Parse Error") @@ -70,9 +71,13 @@ fn main() -> Result<(), Box> { .unwrap(); for statement in parsed_file.into_inner() { - instruct(statement, &out); + instruct(statement, &mut builder); } + let bf = builder.string().unwrap(); + + let mut out = File::create(args.output_file)?; + out.write(bf.as_bytes())?; out.sync_all()?; Ok(())