carlo_repl/
lib.rs

1//! Defines the REPL subcommand.
2
3use carlotk::prelude::*;
4
5/// Help menu
6const HELP: &str = include_str!("../help_repl.txt");
7
8/// Provide help to the user
9pub fn helpme() {
10    printhelp(HELP);
11}
12
13pub fn repl(args: CliArgs) {
14    if args.contains(Flag::Help) {
15        printhelp(HELP);
16    }
17
18    let inputfile = args.inputfile.clone();
19    let debug = args.contains(Flag::Debug);
20
21    let mut i = 0;
22
23    println!("{}", "The Carlo Language".truecolor(20, 146, 255).bold());
24    println!("Version {}", VERSION);
25    println!("Developed by Hobbs Bros.");
26    println!();
27
28    // Initialize parser
29    let parser = Parser::new(debug);
30
31    // Begin environment
32    let mut env = Environment::new();
33
34    // Import file
35    if let Some(i) = &inputfile {
36        println!("Importing {}", i.display());
37        println!();
38    }
39    let imported = parse(inputfile, debug);
40
41    // Evaluated imported file
42    env.evaluate(&imported);
43
44    // Begin REPL
45    let mut rl = DefaultEditor::new().unwrap();
46
47    loop {
48        // Prompt user
49        let readline = match rl.readline(&format!(
50            "In[{}]  >> ",
51            i,
52        )) {
53            Ok (r) => {
54                let _ = rl.add_history_entry(r.as_str());
55                r
56            },
57            Err (_) => Error::CouldNotReadLine (i).throw(),
58        };
59        println!();
60
61        // Parse input
62        let expr = parser.parse(&readline);
63        
64        // Evaluate input
65        let output = env.evaluate(&expr);
66
67        // Output
68        let outputstr = format!("Out[{}] >> {}", i, output);
69        println!("{}", outputstr.truecolor(198, 215, 247));
70
71        if output.len() == 0 {
72            println!();
73        }
74        
75        i += 1;
76    }
77}