aboutsummaryrefslogtreecommitdiff
path: root/apps/cassiopeia/src/format/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'apps/cassiopeia/src/format/mod.rs')
-rw-r--r--apps/cassiopeia/src/format/mod.rs32
1 files changed, 25 insertions, 7 deletions
diff --git a/apps/cassiopeia/src/format/mod.rs b/apps/cassiopeia/src/format/mod.rs
index e55658d515ff..814c08656dbe 100644
--- a/apps/cassiopeia/src/format/mod.rs
+++ b/apps/cassiopeia/src/format/mod.rs
@@ -1,17 +1,33 @@
//! cassiopeia file format
+mod ir;
mod lexer;
mod parser;
+pub(crate) use ir::{IrItem, IrStream, IrType, MakeIr};
pub(crate) use lexer::{LineLexer, LineToken, Token};
pub(crate) use parser::LineCfg;
use crate::TimeFile;
use std::{fs::File, io::Read};
+#[derive(Default)]
+pub struct ParseOutput {
+ pub(crate) ir: IrStream,
+ pub(crate) tf: TimeFile,
+}
+
+impl ParseOutput {
+ fn append(mut self, ir: IrItem) -> Self {
+ self.tf.append(ir.clone());
+ self.ir.push(ir);
+ self
+ }
+}
+
/// Load a file from disk and parse it into a
/// [`TimeFile`](crate::TimeFile)
-pub fn load_file(path: &str) -> Option<TimeFile> {
+pub fn load_file(path: &str) -> Option<ParseOutput> {
let mut f = File::open(path).ok()?;
let mut content = String::new();
f.read_to_string(&mut content).ok()?;
@@ -19,11 +35,13 @@ pub fn load_file(path: &str) -> Option<TimeFile> {
let mut lines: Vec<String> = content.split("\n").map(|l| l.to_owned()).collect();
Some(
- lines
- .iter_mut()
- .map(|line| lexer::lex(line))
- .map(|lex| parser::parse(lex))
- .filter(|line| line.valid())
- .fold(TimeFile::default(), |file, line| file.append(line)),
+ ir::generate_ir(
+ lines
+ .iter_mut()
+ .map(|line| lexer::lex(line))
+ .map(|lex| parser::parse(lex)),
+ )
+ .into_iter()
+ .fold(ParseOutput::default(), |output, ir| output.append(ir)),
)
}