1mod parser;
2
3use clap::ValueEnum;
4pub use parser::*;
5mod prompt;
6pub use prompt::*;
7
8use rail_lang::{rail_machine::RailState, tokens::Token};
9
10#[derive(Clone, Copy, Debug, ValueEnum)]
11pub enum LogLevel {
12 WhateverRailDoes,
13 Trace,
14}
15
16pub fn run(state: RailState, module: Module, log_level: LogLevel) -> RailState {
17 let rail_tokens = module
18 .values
19 .into_iter()
20 .flat_map(to_rail_tokens(log_level))
21 .collect::<Vec<_>>();
22
23 state.run_tokens(rail_tokens)
24}
25
26fn to_rail_tokens(log_level: LogLevel) -> impl Fn(Value) -> Vec<Token> {
27 move |value: Value| {
28 let tokens = match value.clone() {
29 Value::String(s) => vec![Token::String(s)],
30 Value::Identifier(i) => {
31 let token = match Token::from(i) {
32 Token::Term(t) => Token::DeferredTerm(t),
33 t => t,
34 };
35 vec![token]
36 }
37 Value::List(vals) => {
38 let mut tokens = vec![Token::LeftBracket];
39 vals.into_iter()
40 .flat_map(to_rail_tokens(log_level))
41 .for_each(|t| tokens.push(t));
42 tokens.push(Token::RightBracket);
43 tokens
44 }
45 Value::Function(args) => {
46 let mut tokens = match args.len() {
47 0 => vec![],
48 1 => to_rail_tokens(log_level)(args[0].clone()),
49 _ => args
50 .into_iter()
51 .rev()
52 .flat_map(to_rail_tokens(log_level))
53 .collect(),
54 };
55
56 if let Some(token) = tokens.last_mut() {
57 if let Token::DeferredTerm(term) = token {
58 *token = Token::Term(term.to_owned());
59 }
60 }
61
62 tokens
63 }
64 };
65
66 if let LogLevel::Trace = log_level {
67 eprintln!("DEBUG to_rail_tokens({:?}) = {:?}", value, tokens);
68 }
69
70 tokens
71 }
72}