use serde::{Deserialize, Serialize};
use crate::node::{Common, IntoNode, Node};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DiffMode {
#[default]
Unified,
Split,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Diff {
#[serde(flatten)]
pub common: Common,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub patch: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub old: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub new: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mode: Option<DiffMode>,
}
impl Diff {
#[must_use]
pub fn patch(patch: impl Into<String>) -> Self {
Self {
common: Common::new(),
patch: Some(patch.into()),
old: None,
new: None,
path: None,
context: None,
mode: None,
}
}
#[must_use]
pub fn old_new(old: impl Into<String>, new: impl Into<String>) -> Self {
Self {
common: Common::new(),
patch: None,
old: Some(old.into()),
new: Some(new.into()),
path: None,
context: None,
mode: None,
}
}
#[must_use]
pub fn path(mut self, path: impl Into<String>) -> Self {
self.path = Some(path.into());
self
}
#[must_use]
pub fn context(mut self, context: u16) -> Self {
self.context = Some(context);
self
}
#[must_use]
pub fn mode(mut self, mode: DiffMode) -> Self {
self.mode = Some(mode);
self
}
}
impl IntoNode for Diff {}
impl From<Diff> for Node {
fn from(d: Diff) -> Self {
Node::Diff(d)
}
}