diff options
Diffstat (limited to 'rprt-engine/src/selection_functions/mod.rs')
| -rw-r--r-- | rprt-engine/src/selection_functions/mod.rs | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/rprt-engine/src/selection_functions/mod.rs b/rprt-engine/src/selection_functions/mod.rs index 3f64be4..b753200 100644 --- a/rprt-engine/src/selection_functions/mod.rs +++ b/rprt-engine/src/selection_functions/mod.rs @@ -1,5 +1,59 @@ -pub mod function_character; -pub mod function_empty; -pub mod function_end; -pub mod result_transformation; -pub mod types; +use crate::{ + expression::{BuiltinSelectionFn, ResultTransform, SearchModifier}, + selection::Selection, + selection_functions::{ + function_character::selection_function_character, + function_end::selection_function_end, + result_transformation::{complement_transform, conditional_transform}, + types::SFArguments, + }, + state::EditorState, +}; + +mod function_character; +mod function_empty; +mod function_end; +mod result_transformation; +mod types; + +pub use crate::selection_functions::types::{SFError, SFResult}; + +pub fn evaluate_selection_function( + es: &EditorState, + sf: BuiltinSelectionFn, + search_mod: Option<SearchModifier>, + result_transform: Option<ResultTransform>, + left: Option<Selection>, + right: Option<Selection>, +) -> SFResult { + let sf_args = match (left, right) { + (None, None) => Ok(SFArguments::Niladic { es }), + (Some(left), None) => Ok(SFArguments::Monadic { es, left }), + (Some(left), Some(right)) => Ok(SFArguments::Dyadic { es, left, right }), + _ => Err(SFError::NoLeftArgument), + }?; + let res = match sf { + BuiltinSelectionFn::CharOffset(off) => { + selection_function_character(off, &sf_args, search_mod) + } + BuiltinSelectionFn::EndOfBuffer => selection_function_end((), &sf_args, search_mod), + x => Err(SFError::NotImplemented(x).into()), + }?; + + if let Some(result_transform) = result_transform { + match result_transform { + ResultTransform::Complement => complement_transform(es, res), + ResultTransform::Conditional => conditional_transform(res, &sf_args), + ResultTransform::ConditionalComplement => { + let res = complement_transform(es, res)?; + conditional_transform(res, &sf_args) + } + ResultTransform::ComplementConditional => { + let res = conditional_transform(res, &sf_args)?; + complement_transform(es, res) + } + } + } else { + Ok(res) + } +} |
