purple_ssh/app/
form_state.rs1use crate::app::FormBaseline;
2use crate::app::forms::HostForm;
3use crate::app::tag_state::BulkTagEditorState;
4
5pub struct FormState {
10 pub(crate) host: HostForm,
11 pub(crate) host_baseline: Option<FormBaseline>,
12 pub(crate) bulk_tag_editor: BulkTagEditorState,
13 pub(crate) bulk_tag_undo: Option<Vec<(String, Vec<String>)>>,
18 discard_pending: bool,
22}
23
24impl FormState {
25 pub fn request_discard_confirm(&mut self) {
28 self.discard_pending = true;
29 }
30
31 pub fn dismiss_discard_confirm(&mut self) {
34 self.discard_pending = false;
35 }
36
37 pub fn is_discard_pending(&self) -> bool {
40 self.discard_pending
41 }
42}
43
44impl Default for FormState {
45 fn default() -> Self {
46 Self {
47 host: HostForm::new(),
48 host_baseline: None,
49 bulk_tag_editor: BulkTagEditorState::default(),
50 bulk_tag_undo: None,
51 discard_pending: false,
52 }
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn default_is_empty() {
62 let s = FormState::default();
63 assert!(!s.is_discard_pending());
64 assert!(s.bulk_tag_undo.is_none());
65 assert!(s.host_baseline.is_none());
66 assert!(s.bulk_tag_editor.rows.is_empty());
67 }
68
69 #[test]
70 fn discard_confirm_lifecycle() {
71 let mut s = FormState::default();
72 assert!(!s.is_discard_pending());
73 s.request_discard_confirm();
74 assert!(s.is_discard_pending());
75 s.dismiss_discard_confirm();
76 assert!(!s.is_discard_pending());
77 }
78}