Apply the TODO keyword settings.

This commit is contained in:
Tom Alexander 2023-09-06 11:00:19 -04:00
parent bdba495f69
commit 70fafd801e
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
4 changed files with 49 additions and 5 deletions

View File

@ -1,3 +1,5 @@
use std::collections::BTreeSet;
use super::FileAccessInterface; use super::FileAccessInterface;
use super::LocalFileAccessInterface; use super::LocalFileAccessInterface;
use crate::types::Object; use crate::types::Object;
@ -8,6 +10,8 @@ use crate::types::Object;
pub struct GlobalSettings<'g, 's> { pub struct GlobalSettings<'g, 's> {
pub radio_targets: Vec<&'g Vec<Object<'s>>>, pub radio_targets: Vec<&'g Vec<Object<'s>>>,
pub file_access: &'g dyn FileAccessInterface, pub file_access: &'g dyn FileAccessInterface,
pub in_progress_todo_keywords: BTreeSet<String>,
pub complete_todo_keywords: BTreeSet<String>,
} }
impl<'g, 's> GlobalSettings<'g, 's> { impl<'g, 's> GlobalSettings<'g, 's> {
@ -17,6 +21,8 @@ impl<'g, 's> GlobalSettings<'g, 's> {
file_access: &LocalFileAccessInterface { file_access: &LocalFileAccessInterface {
working_directory: None, working_directory: None,
}, },
in_progress_todo_keywords: BTreeSet::new(),
complete_todo_keywords: BTreeSet::new()
} }
} }
} }

View File

@ -148,11 +148,13 @@ fn run_parse_on_file<P: AsRef<Path>>(org_path: P) -> Result<(), Box<dyn std::err
.ok_or("Should be contained inside a directory.")?; .ok_or("Should be contained inside a directory.")?;
let org_contents = std::fs::read_to_string(org_path)?; let org_contents = std::fs::read_to_string(org_path)?;
let org_contents = org_contents.as_str(); let org_contents = org_contents.as_str();
let global_settings = GlobalSettings { let file_access_interface = LocalFileAccessInterface {
radio_targets: Vec::new(),
file_access: &LocalFileAccessInterface {
working_directory: Some(parent_directory.to_path_buf()), working_directory: Some(parent_directory.to_path_buf()),
}, };
let global_settings = {
let mut global_settings = GlobalSettings::default();
global_settings.file_access = &file_access_interface;
global_settings
}; };
let rust_parsed = parse_with_settings(org_contents, &global_settings)?; let rust_parsed = parse_with_settings(org_contents, &global_settings)?;
println!("{:#?}", rust_parsed); println!("{:#?}", rust_parsed);

View File

@ -18,6 +18,7 @@ use nom::multi::many_till;
use nom::multi::separated_list1; use nom::multi::separated_list1;
use nom::sequence::tuple; use nom::sequence::tuple;
use super::in_buffer_settings::apply_in_buffer_settings;
use super::in_buffer_settings::scan_for_in_buffer_settings; use super::in_buffer_settings::scan_for_in_buffer_settings;
use super::org_source::OrgSource; use super::org_source::OrgSource;
use super::token::AllTokensIterator; use super::token::AllTokensIterator;
@ -124,6 +125,15 @@ fn document_org_source<'b, 'g, 'r, 's>(
final_settings.extend(setup_file_settings); final_settings.extend(setup_file_settings);
} }
final_settings.extend(document_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. // TODO: read the keywords into settings and apply them to the GlobalSettings.
let (remaining, document) = let (remaining, document) =

View File

@ -6,9 +6,11 @@ use nom::multi::many0;
use nom::multi::many_till; use nom::multi::many_till;
use super::keyword::filtered_keyword; use super::keyword::filtered_keyword;
use super::keyword_todo::keyword_todo;
use super::OrgSource; use super::OrgSource;
use crate::error::Res; use crate::error::Res;
use crate::types::Keyword; use crate::types::Keyword;
use crate::GlobalSettings;
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
pub fn scan_for_in_buffer_settings<'s>( pub fn scan_for_in_buffer_settings<'s>(
@ -41,3 +43,27 @@ fn in_buffer_settings_key<'s>(input: OrgSource<'s>) -> Res<OrgSource<'s>, OrgSou
tag_no_case("typ_todo"), tag_no_case("typ_todo"),
))(input) ))(input)
} }
pub fn apply_in_buffer_settings<'g, 's, 'sf>(
keywords: Vec<Keyword<'sf>>,
original_settings: &'g GlobalSettings<'g, 's>,
) -> Result<GlobalSettings<'g, 's>, 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)
}