Apply the TODO keyword settings.
This commit is contained in:
parent
bdba495f69
commit
70fafd801e
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
src/main.rs
10
src/main.rs
@ -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);
|
||||||
|
@ -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) =
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user