stap_lang/
lib.rs

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}