use crate::app::FormBaseline;
use crate::app::forms::HostForm;
use crate::app::tag_state::BulkTagEditorState;
pub struct FormState {
pub(in crate::app) host: HostForm,
pub(in crate::app) host_baseline: Option<FormBaseline>,
pub(in crate::app) bulk_tag_editor: BulkTagEditorState,
pub(in crate::app) bulk_tag_undo: Option<Vec<(String, Vec<String>)>>,
discard_pending: bool,
}
impl FormState {
pub fn request_discard_confirm(&mut self) {
self.discard_pending = true;
}
pub fn dismiss_discard_confirm(&mut self) {
self.discard_pending = false;
}
pub fn is_discard_pending(&self) -> bool {
self.discard_pending
}
pub fn host(&self) -> &HostForm {
&self.host
}
pub fn host_mut(&mut self) -> &mut HostForm {
&mut self.host
}
pub fn host_baseline(&self) -> Option<&FormBaseline> {
self.host_baseline.as_ref()
}
pub fn set_host_baseline(&mut self, baseline: Option<FormBaseline>) {
self.host_baseline = baseline;
}
pub fn take_host_baseline(&mut self) -> Option<FormBaseline> {
self.host_baseline.take()
}
pub fn bulk_tag_editor(&self) -> &BulkTagEditorState {
&self.bulk_tag_editor
}
pub fn bulk_tag_editor_mut(&mut self) -> &mut BulkTagEditorState {
&mut self.bulk_tag_editor
}
pub fn bulk_tag_undo(&self) -> Option<&Vec<(String, Vec<String>)>> {
self.bulk_tag_undo.as_ref()
}
pub fn set_bulk_tag_undo(&mut self, undo: Option<Vec<(String, Vec<String>)>>) {
self.bulk_tag_undo = undo;
}
pub fn take_bulk_tag_undo(&mut self) -> Option<Vec<(String, Vec<String>)>> {
self.bulk_tag_undo.take()
}
}
impl Default for FormState {
fn default() -> Self {
Self {
host: HostForm::new(),
host_baseline: None,
bulk_tag_editor: BulkTagEditorState::default(),
bulk_tag_undo: None,
discard_pending: false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_empty() {
let s = FormState::default();
assert!(!s.is_discard_pending());
assert!(s.bulk_tag_undo.is_none());
assert!(s.host_baseline.is_none());
assert!(s.bulk_tag_editor.rows.is_empty());
}
#[test]
fn discard_confirm_lifecycle() {
let mut s = FormState::default();
assert!(!s.is_discard_pending());
s.request_discard_confirm();
assert!(s.is_discard_pending());
s.dismiss_discard_confirm();
assert!(!s.is_discard_pending());
}
}