1use std::{fs, path::PathBuf};
2
3use anyhow::Result;
4use clap::Parser;
5use qsc_cranelift_jit::JITModule;
6use target_lexicon::Triple;
7
8use crate::{ast::AstParser, codegen::backend::CraneliftBackend, tokenizer::Tokenizer};
9
10use super::Command;
11
12#[derive(Debug, Clone, Parser)]
13pub struct RunCommand {
14 pub file: PathBuf,
16}
17
18impl Command for RunCommand {
19 fn execute(&mut self) -> Result<()> {
20 let content = fs::read_to_string(self.file.clone())?;
21 let mut tokenizer = Tokenizer::from(content);
22
23 tokenizer.tokenize();
24
25 let mut parser = AstParser::new(tokenizer.tokens);
26
27 parser.parse()?;
28
29 let mut back = CraneliftBackend::<JITModule>::new(Triple::host(), false)?;
30
31 back.compile(parser.exprs)?;
32
33 back.run()?;
34
35 Ok(())
36 }
37}