#[cfg(test)]
mod tests;
use std::{
fmt::Display,
ops::{Deref, DerefMut},
};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub trait Modifiable {
fn is_modified(&self) -> bool;
}
#[derive(Default, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(transparent))]
pub struct Modify<T> {
value: T,
#[cfg_attr(feature = "serde", serde(skip))]
modified: bool,
}
impl<T> Modify<T> {
pub fn new(value: T) -> Self {
Self {
value,
modified: false,
}
}
pub fn saved(&mut self) {
self.modified = false;
}
}
impl<T> Modifiable for Modify<T> {
fn is_modified(&self) -> bool {
self.modified
}
}
impl<T> Display for Modify<T>
where
T: Display,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.value)
}
}
impl<T> From<T> for Modify<T> {
fn from(value: T) -> Self {
Self::new(value)
}
}
impl<T> Deref for Modify<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T> DerefMut for Modify<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.modified = true;
&mut self.value
}
}