From fa73cf258ae7896f627e6bdacb9571c8e91a78a3 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Thu, 20 Jun 2019 19:23:57 -0500 Subject: [PATCH] FEATURE: out statements work in a REPL --- src/main.rs | 59 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index ce28f2d..09792be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -90,7 +90,9 @@ fn run_converter(c: &traits::Converter, v: Rc, f: Option<&str>) -> traits:: } None => Box::new(io::stdout()), }; - c.convert(v, file.as_mut()) + let result = c.convert(v, file.as_mut()); + file.flush()?; + result } fn build_file<'a, C: Cache>( @@ -143,6 +145,30 @@ fn do_validate( return true; } +fn process_output( + output: &Option<(String, Rc)>, + file: Option<&str>, + registry: &ConverterRegistry, +) -> bool { + let (typ, val) = match output { + Some((ref typ, ref val)) => (typ, val.clone()), + None => { + return false; + } + }; + match registry.get_converter(typ) { + Some(converter) => { + run_converter(converter, val, file).unwrap(); + eprintln!("\nConversion successful"); + return true; + } + None => { + eprintln!("No such converter {}", typ); + return false; + } + } +} + fn do_compile( file: &str, strict: bool, @@ -158,24 +184,10 @@ fn do_compile( return false; } }; - let (typ, val) = match builder.out_lock { - Some((ref typ, ref val)) => (typ, val.clone()), - None => { - eprintln!("Build results in no artifacts."); - return false; - } - }; - match registry.get_converter(typ) { - Some(converter) => { - run_converter(converter, val, Some(file)).unwrap(); - eprintln!("Build successful"); - return true; - } - None => { - eprintln!("No such converter {}", typ); - return false; - } + if builder.out_lock.is_none() { + eprintln!("Build results in no artifacts."); } + process_output(&builder.out_lock, Some(file), registry) } fn visit_ucg_files( @@ -608,9 +620,14 @@ fn do_repl( // print the result Err(e) => eprintln!("{}", e), Ok(v) => { - println!("{}", v); - editor.history_mut().add(stmt); - editor.save_history(&config_home)?; + if builder.out_lock.is_some() { + process_output(&builder.out_lock, None, registry); + builder.out_lock = None; + } else { + println!("{}", v); + editor.history_mut().add(stmt); + editor.save_history(&config_home)?; + } } } // start loop over at prompt.