use std::collections::{BTreeMap, BTreeSet};
use std::fmt::Debug;
use uuid::Uuid;
use crate::metadata::{AnnotationValue, Field, WeightValue};
#[cfg(feature = "serde")]
fn is_default<T: Default + PartialEq>(value: &T) -> bool {
value == &Default::default()
}
#[derive(Clone, Debug, PartialEq, bon::Builder)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(default, rename_all = "camelCase")
)]
#[builder(on(String, into))]
pub struct Transaction<N, K, L, W, WV, A, AV>
where
N: Field,
K: Field,
L: Field,
W: Field,
WV: WeightValue,
A: Field,
AV: AnnotationValue,
{
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "is_default"))]
#[builder(default)]
pub mode: TransactionMode,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[builder(into)]
pub id: Option<Uuid>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[builder(into)]
pub name: Option<N>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
#[builder(into)]
pub kind: Option<K>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub labels: Option<BTreeSet<L>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub weights: Option<BTreeMap<W, WV>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub annotations: Option<BTreeMap<A, AV>>,
}
impl<N, K, L, W, WV, A, AV> Default for Transaction<N, K, L, W, WV, A, AV>
where
N: Field,
K: Field,
L: Field,
W: Field,
WV: WeightValue,
A: Field,
AV: AnnotationValue,
{
fn default() -> Self {
Self {
mode: Default::default(),
id: Default::default(),
name: Default::default(),
kind: Default::default(),
labels: Default::default(),
weights: Default::default(),
annotations: Default::default(),
}
}
}
impl<N, K, L, W, WV, A, AV> Transaction<N, K, L, W, WV, A, AV>
where
N: Field,
K: Field,
L: Field,
W: Field,
WV: WeightValue,
A: Field,
AV: AnnotationValue,
{
pub fn strip_id(&mut self) -> Option<Uuid> {
self.id.take()
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(rename_all = "camelCase")
)]
pub enum TransactionMode {
Replace,
#[default]
Append,
}