use std::sync::Arc;
use crate::model::IModel;
use crate::text::ITextStructureHandler;
use crate::util::{CharSequenceValue, Utf16String, Validate, ValidateError};
pub(crate) struct TextStructureHandler {
pub(crate) set_text: bool,
pub(crate) set_text_value: Option<Arc<dyn CharSequenceValue>>,
pub(crate) replace_with_model: bool,
pub(crate) replace_with_model_value: Option<Arc<dyn IModel>>,
pub(crate) replace_with_model_processable: bool,
pub(crate) remove_text: bool,
}
impl TextStructureHandler {
pub(crate) fn new() -> Self {
let mut handler = Self {
set_text: false,
set_text_value: None,
replace_with_model: false,
replace_with_model_value: None,
replace_with_model_processable: false,
remove_text: false,
};
handler.reset();
handler
}
pub(crate) fn set_text_nullable(
&mut self,
text: Option<Arc<dyn CharSequenceValue>>,
) -> Result<(), ValidateError> {
self.reset();
Validate::not_null(text.as_deref(), Some("Text cannot be null"))?;
self.set_text = true;
self.set_text_value = text;
Ok(())
}
pub(crate) fn replace_with_nullable(
&mut self,
model: Option<Arc<dyn IModel>>,
processable: bool,
) -> Result<(), ValidateError> {
self.reset();
Validate::not_null(model.as_deref(), Some("Model cannot be null"))?;
self.replace_with_model = true;
self.replace_with_model_value = model;
self.replace_with_model_processable = processable;
Ok(())
}
}
impl ITextStructureHandler for TextStructureHandler {
fn reset(&mut self) {
self.set_text = false;
self.set_text_value = None;
self.replace_with_model = false;
self.replace_with_model_value = None;
self.replace_with_model_processable = false;
self.remove_text = false;
}
fn set_text(&mut self, text: Utf16String) {
self.set_text_nullable(Some(Arc::new(text)))
.expect("Rust non-null text boundary must satisfy Java validation");
}
fn set_text_sequence(&mut self, text: Arc<dyn CharSequenceValue>) {
self.set_text_nullable(Some(text))
.expect("Rust non-null text boundary must satisfy Java validation");
}
fn replace_with(&mut self, model: Arc<dyn IModel>, processable: bool) {
self.replace_with_nullable(Some(model), processable)
.expect("Rust non-null model boundary must satisfy Java validation");
}
fn remove_text(&mut self) {
self.reset();
self.remove_text = true;
}
}