diff --git a/src/main.rs b/src/main.rs index f8f60bf..48bb731 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,8 @@ use std::fs; use std::path::PathBuf; -use pest::Parser; use structopt::StructOpt; -use parse::{MyParser, Rule}; - mod commands; mod parse; @@ -18,7 +15,7 @@ pub struct Opt { fn main() -> anyhow::Result<()> { let opt = Opt::from_args(); let content = fs::read_to_string(&opt.file)?; - let parsed = MyParser::parse(Rule::file, &content)?.next().unwrap(); - println!("{:#?}", parsed); + let commands = parse::parse(&content)?; + println!("{:#?}", commands); Ok(()) } diff --git a/src/parse.rs b/src/parse.rs index 9b0bd67..3b44cb5 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,3 +1,34 @@ +use std::result; + +use pest::error::Error; +use pest::iterators::Pair; +use pest::Parser; + +use crate::commands::{Command, Task}; + #[derive(pest_derive::Parser)] -#[grammar = "parse/grammar.pest"] -pub struct MyParser; +#[grammar = "parse/todayfile.pest"] +struct TodayfileParser; + +type Result = result::Result>; + +pub fn parse(input: &str) -> Result> { + let mut pairs = TodayfileParser::parse(Rule::file, input)?; + let file = pairs.next().unwrap(); + let commands = file.into_inner(); + commands.map(parse_command).collect() +} + +fn parse_command(p: Pair) -> Result { + match p.as_rule() { + Rule::task => parse_task(p).map(Command::Task), + Rule::note => todo!(), + Rule::birthday => todo!(), + _ => unreachable!(), + } +} + +fn parse_task(p: Pair) -> Result { + dbg!(p); + todo!() +} diff --git a/src/parse/grammar.pest b/src/parse/todayfile.pest similarity index 100% rename from src/parse/grammar.pest rename to src/parse/todayfile.pest