From 4f055167837f26e87ad1da77dc295769399a7aac Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Sat, 17 Jun 2017 01:19:21 +0200 Subject: [PATCH 1/3] Add a simple repl example --- examples/repl.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 examples/repl.rs diff --git a/examples/repl.rs b/examples/repl.rs new file mode 100644 index 0000000..6691f0b --- /dev/null +++ b/examples/repl.rs @@ -0,0 +1,30 @@ +//! This example shows a simple read-evaluate-print-loop (REPL). + +extern crate rlua; + +use rlua::*; +use std::io::prelude::*; +use std::io::{stdin, stdout, stderr, BufReader}; + +fn main() { + let lua = Lua::new(); + let mut stdout = stdout(); + let mut stdin = BufReader::new(stdin()); + + loop { + write!(stdout, "> ").unwrap(); + stdout.flush().unwrap(); + + let mut line = String::new(); + stdin.read_line(&mut line).unwrap(); + + match lua.eval::(&line) { + Ok(values) => { + println!("{}", values.iter().map(|value| format!("{:?}", value)).collect::>().join("\t")); + } + Err(e) => { + writeln!(stderr(), "error: {}", e).unwrap(); + } + } + } +} From 2cddfecfb2db291836c61d28a20130d923732768 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Sat, 17 Jun 2017 01:53:51 +0200 Subject: [PATCH 2/3] Enable `io.popen` on Linux --- build.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/build.rs b/build.rs index 1dec803..fd4f1d2 100644 --- a/build.rs +++ b/build.rs @@ -1,8 +1,17 @@ extern crate gcc; +use std::env; + fn main() { - gcc::Config::new() - .define("LUA_USE_APICHECK", None) + let mut config = gcc::Config::new(); + + if env::var("CARGO_CFG_TARGET_OS") == Ok("linux".to_string()) { + // Among other things, this enables `io.popen` support. + // Despite the name, we could enable this on more platforms. + config.define("LUA_USE_LINUX", None); + } + + config.define("LUA_USE_APICHECK", None) .include("lua") .file("lua/lapi.c") .file("lua/lauxlib.c") From 4a980de0edebb8de93531d0af9bc286c73053313 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Sat, 17 Jun 2017 14:43:05 +0200 Subject: [PATCH 3/3] Allow multiline input in the REPL example --- examples/repl.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/examples/repl.rs b/examples/repl.rs index 6691f0b..17b9e3a 100644 --- a/examples/repl.rs +++ b/examples/repl.rs @@ -16,14 +16,24 @@ fn main() { stdout.flush().unwrap(); let mut line = String::new(); - stdin.read_line(&mut line).unwrap(); - match lua.eval::(&line) { - Ok(values) => { - println!("{}", values.iter().map(|value| format!("{:?}", value)).collect::>().join("\t")); - } - Err(e) => { - writeln!(stderr(), "error: {}", e).unwrap(); + loop { + stdin.read_line(&mut line).unwrap(); + + match lua.eval::(&line) { + Ok(values) => { + println!("{}", values.iter().map(|value| format!("{:?}", value)).collect::>().join("\t")); + break; + } + Err(LuaError(LuaErrorKind::IncompleteStatement(_), _)) => { + // continue reading input and append it to `line` + write!(stdout, ">> ").unwrap(); + stdout.flush().unwrap(); + } + Err(e) => { + writeln!(stderr(), "error: {}", e).unwrap(); + break; + } } } }