From 70fafd801ec9823acb322548188baae6441042b4 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 6 Sep 2023 11:00:19 -0400 Subject: [PATCH] Apply the TODO keyword settings. --- src/context/global_settings.rs | 6 ++++++ src/main.rs | 12 +++++++----- src/parser/document.rs | 10 ++++++++++ src/parser/in_buffer_settings.rs | 26 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/context/global_settings.rs b/src/context/global_settings.rs index f1b4d1bb..efeccfc4 100644 --- a/src/context/global_settings.rs +++ b/src/context/global_settings.rs @@ -1,3 +1,5 @@ +use std::collections::BTreeSet; + use super::FileAccessInterface; use super::LocalFileAccessInterface; use crate::types::Object; @@ -8,6 +10,8 @@ use crate::types::Object; pub struct GlobalSettings<'g, 's> { pub radio_targets: Vec<&'g Vec>>, pub file_access: &'g dyn FileAccessInterface, + pub in_progress_todo_keywords: BTreeSet, + pub complete_todo_keywords: BTreeSet, } impl<'g, 's> GlobalSettings<'g, 's> { @@ -17,6 +21,8 @@ impl<'g, 's> GlobalSettings<'g, 's> { file_access: &LocalFileAccessInterface { working_directory: None, }, + in_progress_todo_keywords: BTreeSet::new(), + complete_todo_keywords: BTreeSet::new() } } } diff --git a/src/main.rs b/src/main.rs index fd823864..e5a19dcd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -148,11 +148,13 @@ fn run_parse_on_file>(org_path: P) -> Result<(), Box( final_settings.extend(setup_file_settings); } final_settings.extend(document_settings); + let new_settings = apply_in_buffer_settings(final_settings, context.get_global_settings()).map_err(|_err| { + nom::Err::Error(CustomError::MyError(MyError( + "TODO: make this take an owned string so I can dump err.to_string() into it." + .into(), + ))) + })?; + let new_context = context.with_global_settings(&new_settings); + let context = &new_context; + // TODO: read the keywords into settings and apply them to the GlobalSettings. let (remaining, document) = diff --git a/src/parser/in_buffer_settings.rs b/src/parser/in_buffer_settings.rs index 3c533ac5..f2ff0e7f 100644 --- a/src/parser/in_buffer_settings.rs +++ b/src/parser/in_buffer_settings.rs @@ -6,9 +6,11 @@ use nom::multi::many0; use nom::multi::many_till; use super::keyword::filtered_keyword; +use super::keyword_todo::keyword_todo; use super::OrgSource; use crate::error::Res; use crate::types::Keyword; +use crate::GlobalSettings; #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] pub fn scan_for_in_buffer_settings<'s>( @@ -41,3 +43,27 @@ fn in_buffer_settings_key<'s>(input: OrgSource<'s>) -> Res, OrgSou tag_no_case("typ_todo"), ))(input) } + +pub fn apply_in_buffer_settings<'g, 's, 'sf>( + keywords: Vec>, + original_settings: &'g GlobalSettings<'g, 's>, +) -> Result, String> { + let mut new_settings = original_settings.clone(); + + for kw in keywords.iter().filter(|kw| { + kw.key.eq_ignore_ascii_case("todo") + || kw.key.eq_ignore_ascii_case("seq_todo") + || kw.key.eq_ignore_ascii_case("typ_todo") + }) { + let (_, (in_progress_words, complete_words)) = + keyword_todo(kw.value).map_err(|err| err.to_string())?; + new_settings + .in_progress_todo_keywords + .extend(in_progress_words.into_iter().map(str::to_string)); + new_settings + .complete_todo_keywords + .extend(complete_words.into_iter().map(str::to_string)); + } + + Ok(new_settings) +}