1
1
//! This example shows a simple read-evaluate-print-loop (REPL).
2
2
3
3
extern crate rlua;
4
+ extern crate rustyline;
4
5
5
6
use rlua:: { Lua , MultiValue , Error } ;
6
- use std:: io:: prelude:: * ;
7
- use std:: io:: { stdin, stdout, stderr, BufReader } ;
7
+ use rustyline:: Editor ;
8
8
9
9
fn main ( ) {
10
10
let lua = Lua :: new ( ) ;
11
- let mut stdout = stdout ( ) ;
12
- let mut stdin = BufReader :: new ( stdin ( ) ) ;
11
+ let mut editor = Editor :: < ( ) > :: new ( ) ;
13
12
14
13
loop {
15
- write ! ( stdout, "> " ) . unwrap ( ) ;
16
- stdout. flush ( ) . unwrap ( ) ;
17
-
14
+ let mut prompt = "> " ;
18
15
let mut line = String :: new ( ) ;
19
16
20
17
loop {
21
- stdin. read_line ( & mut line) . unwrap ( ) ;
18
+ match editor. readline ( prompt) {
19
+ Ok ( input) => line. push_str ( & input) ,
20
+ Err ( _) => return ,
21
+ }
22
22
23
23
match lua. eval :: < MultiValue > ( & line, None ) {
24
24
Ok ( values) => {
25
+ editor. add_history_entry ( & line) ;
25
26
println ! (
26
27
"{}" ,
27
28
values
@@ -34,11 +35,11 @@ fn main() {
34
35
}
35
36
Err ( Error :: IncompleteStatement ( _) ) => {
36
37
// continue reading input and append it to `line`
37
- write ! ( stdout , ">> " ) . unwrap ( ) ;
38
- stdout . flush ( ) . unwrap ( ) ;
38
+ line . push_str ( " \n " ) ; // separate input lines
39
+ prompt = ">> " ;
39
40
}
40
41
Err ( e) => {
41
- writeln ! ( stderr ( ) , "error: {}" , e) . unwrap ( ) ;
42
+ eprintln ! ( "error: {}" , e) ;
42
43
break ;
43
44
}
44
45
}
0 commit comments