1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3use std::fmt::Debug;
4
5#[cfg(test)]
6mod tests;
7
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9#[derive(Clone)]
10pub struct Reversible<T: Default + Debug + Clone> {
11 #[cfg_attr(feature = "serde", serde(flatten))]
12 data: T,
13 #[cfg_attr(feature = "serde", serde(skip))]
14 edit: Option<T>,
15}
16impl<T: Default + Debug + Clone> AsRef<T> for Reversible<T> {
17 fn as_ref(&self) -> &T {
18 &self.data
19 }
20}
21impl<T: Default + Debug + Clone> AsMut<T> for Reversible<T> {
22 fn as_mut(&mut self) -> &mut T {
23 if self.edit.is_none() {
24 self.force_edit();
25 }
26 self.edit.as_mut().expect("self.edit is always Some")
27 }
28}
29impl<T: Default + Debug + Clone> std::fmt::Debug for Reversible<T> {
30 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31 write!(f, "{:?}", self.as_ref())
32 }
33}
34impl<T: Default + Debug + Clone> Default for Reversible<T> {
35 fn default() -> Self {
36 Reversible {
37 data: T::default(),
38 edit: None,
39 }
40 }
41}
42impl<T: Default + Debug + Clone> From<T> for Reversible<T> {
43 fn from(value: T) -> Self {
44 Reversible::new(value)
45 }
46}
47
48impl<T: Default + Debug + Clone> Reversible<T> {
49 pub fn new(data: T) -> Self {
50 Reversible { data, edit: None }
51 }
52 pub fn as_ref_edit(&self) -> &T {
54 match &self.edit {
55 Some(edit) => edit,
56 None => &self.data,
57 }
58 }
59
60 pub fn as_mut_data(&mut self) -> &mut T {
62 &mut self.data
63 }
64
65 pub fn save(&mut self) {
77 if let Some(edit) = self.edit.take() {
78 self.data = edit;
79 }
80 }
81
82 pub fn revert(&mut self) {
94 self.edit = None;
95 }
96
97 pub fn is_edit(&self) -> bool {
106 self.edit.is_some()
107 }
108
109 pub fn force_edit(&mut self) {
118 self.edit = Some(self.data.clone());
119 }
120}