#![allow(missing_docs)]
use massa_serialization::{Deserializer, SerializeError, Serializer};
use nom::bytes::complete::take;
use nom::{
error::{ContextError, ParseError},
IResult,
};
use serde::{Deserialize, Serialize};
pub trait Applicable<V> {
fn apply(&mut self, _: V);
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub enum SetUpdateOrDelete<T: Default + Applicable<V>, V: Applicable<V> + Clone> {
Set(T),
Update(V),
Delete,
}
pub struct SetUpdateOrDeleteDeserializer<
T: Default + Applicable<V>,
V: Applicable<V> + Clone,
DT: Deserializer<T>,
DV: Deserializer<V>,
> {
inner_deserializer_set: DT,
inner_deserializer_update: DV,
phantom_t: std::marker::PhantomData<T>,
phantom_v: std::marker::PhantomData<V>,
}
impl<
T: Default + Applicable<V>,
V: Applicable<V> + Clone,
DT: Deserializer<T>,
DV: Deserializer<V>,
> SetUpdateOrDeleteDeserializer<T, V, DT, DV>
{
pub fn new(inner_deserializer_set: DT, inner_deserializer_update: DV) -> Self {
Self {
inner_deserializer_set,
inner_deserializer_update,
phantom_t: std::marker::PhantomData,
phantom_v: std::marker::PhantomData,
}
}
}
impl<
T: Default + Applicable<V>,
V: Applicable<V> + Clone,
DT: Deserializer<T>,
DV: Deserializer<V>,
> Deserializer<SetUpdateOrDelete<T, V>> for SetUpdateOrDeleteDeserializer<T, V, DT, DV>
{
fn deserialize<'a, E: ParseError<&'a [u8]> + ContextError<&'a [u8]>>(
&self,
buffer: &'a [u8],
) -> IResult<&'a [u8], SetUpdateOrDelete<T, V>, E> {
let (rest0, buffer0) = take(1usize)(buffer)?;
match buffer0[0] {
0 => {
let (rest, value) = self.inner_deserializer_set.deserialize(rest0)?;
Ok((rest, SetUpdateOrDelete::Set(value)))
}
1 => {
let (rest, value) = self.inner_deserializer_update.deserialize(rest0)?;
Ok((rest, SetUpdateOrDelete::Update(value)))
}
2 => Ok((rest0, SetUpdateOrDelete::Delete)),
_ => Err(nom::Err::Error(ParseError::from_error_kind(
buffer,
nom::error::ErrorKind::Digit,
))),
}
}
}
pub struct SetUpdateOrDeleteSerializer<
T: Default + Applicable<V>,
V: Applicable<V> + Clone,
ST: Serializer<T>,
SV: Serializer<V>,
> {
inner_serializer_set: ST,
inner_serializer_update: SV,
phantom_t: std::marker::PhantomData<T>,
phantom_v: std::marker::PhantomData<V>,
}
impl<
T: Default + Applicable<V>,
V: Applicable<V> + Clone,
ST: Serializer<T>,
SV: Serializer<V>,
> SetUpdateOrDeleteSerializer<T, V, ST, SV>
{
pub fn new(inner_serializer_set: ST, inner_serializer_update: SV) -> Self {
Self {
inner_serializer_set,
inner_serializer_update,
phantom_t: std::marker::PhantomData,
phantom_v: std::marker::PhantomData,
}
}
}
impl<
T: Default + Applicable<V>,
V: Applicable<V> + Clone,
ST: Serializer<T>,
SV: Serializer<V>,
> Serializer<SetUpdateOrDelete<T, V>> for SetUpdateOrDeleteSerializer<T, V, ST, SV>
{
fn serialize(
&self,
value: &SetUpdateOrDelete<T, V>,
buffer: &mut Vec<u8>,
) -> Result<(), SerializeError> {
match value {
SetUpdateOrDelete::Set(value) => {
buffer.push(0);
self.inner_serializer_set.serialize(value, buffer)?;
Ok(())
}
SetUpdateOrDelete::Update(value) => {
buffer.push(1);
self.inner_serializer_update.serialize(value, buffer)?;
Ok(())
}
SetUpdateOrDelete::Delete => {
buffer.push(2);
Ok(())
}
}
}
}
impl<T: Default + Applicable<V>, V: Applicable<V>> Applicable<SetUpdateOrDelete<T, V>>
for SetUpdateOrDelete<T, V>
where
V: Clone,
{
fn apply(&mut self, other: SetUpdateOrDelete<T, V>) {
match other {
v @ SetUpdateOrDelete::Set(_) => *self = v,
SetUpdateOrDelete::Update(u) => match self {
SetUpdateOrDelete::Set(cur) => cur.apply(u),
SetUpdateOrDelete::Update(cur) => cur.apply(u),
SetUpdateOrDelete::Delete => {
let mut res = T::default();
res.apply(u);
*self = SetUpdateOrDelete::Set(res);
}
},
v @ SetUpdateOrDelete::Delete => *self = v,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub enum SetOrDelete<T: Clone> {
Set(T),
Delete,
}
pub struct SetOrDeleteDeserializer<T: Clone, DT: Deserializer<T>> {
inner_deserializer: DT,
phantom_t: std::marker::PhantomData<T>,
}
impl<T: Clone, DT: Deserializer<T>> SetOrDeleteDeserializer<T, DT> {
pub fn new(inner_deserializer: DT) -> Self {
Self {
inner_deserializer,
phantom_t: std::marker::PhantomData,
}
}
}
impl<T: Clone, DT: Deserializer<T>> Deserializer<SetOrDelete<T>>
for SetOrDeleteDeserializer<T, DT>
{
fn deserialize<'a, E: ParseError<&'a [u8]> + ContextError<&'a [u8]>>(
&self,
buffer: &'a [u8],
) -> IResult<&'a [u8], SetOrDelete<T>, E> {
let (rest0, buffer0) = take(1usize)(buffer)?;
match buffer0[0] {
0 => {
let (rest, value) = self.inner_deserializer.deserialize(rest0)?;
Ok((rest, SetOrDelete::Set(value)))
}
1 => Ok((rest0, SetOrDelete::Delete)),
_ => Err(nom::Err::Error(ParseError::from_error_kind(
buffer,
nom::error::ErrorKind::Digit,
))),
}
}
}
pub struct SetOrDeleteSerializer<T: Clone, ST: Serializer<T>> {
inner_serializer: ST,
phantom_t: std::marker::PhantomData<T>,
}
impl<T: Clone, ST: Serializer<T>> SetOrDeleteSerializer<T, ST> {
pub fn new(inner_serializer: ST) -> Self {
Self {
inner_serializer,
phantom_t: std::marker::PhantomData,
}
}
}
impl<T: Clone, ST: Serializer<T>> Serializer<SetOrDelete<T>> for SetOrDeleteSerializer<T, ST> {
fn serialize(
&self,
value: &SetOrDelete<T>,
buffer: &mut Vec<u8>,
) -> Result<(), SerializeError> {
match value {
SetOrDelete::Set(value) => {
buffer.push(0);
self.inner_serializer.serialize(value, buffer)?;
Ok(())
}
SetOrDelete::Delete => {
buffer.push(1);
Ok(())
}
}
}
}
impl<T: Clone> Applicable<SetOrDelete<T>> for SetOrDelete<T> {
fn apply(&mut self, other: Self) {
*self = other;
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub enum SetOrKeep<T: Clone> {
Set(T),
Keep,
}
pub struct SetOrKeepDeserializer<T: Clone, DT: Deserializer<T>> {
inner_deserializer: DT,
phantom_t: std::marker::PhantomData<T>,
}
impl<T: Clone, DT: Deserializer<T>> SetOrKeepDeserializer<T, DT> {
pub fn new(inner_deserializer: DT) -> Self {
Self {
inner_deserializer,
phantom_t: std::marker::PhantomData,
}
}
}
impl<T: Clone, DT: Deserializer<T>> Deserializer<SetOrKeep<T>> for SetOrKeepDeserializer<T, DT> {
fn deserialize<'a, E: ParseError<&'a [u8]> + ContextError<&'a [u8]>>(
&self,
buffer: &'a [u8],
) -> IResult<&'a [u8], SetOrKeep<T>, E> {
let (rest0, buffer0) = take(1usize)(buffer)?;
match buffer0[0] {
0 => {
let (rest, value) = self.inner_deserializer.deserialize(rest0)?;
Ok((rest, SetOrKeep::Set(value)))
}
1 => Ok((rest0, SetOrKeep::Keep)),
_ => Err(nom::Err::Error(ParseError::from_error_kind(
buffer,
nom::error::ErrorKind::Digit,
))),
}
}
}
pub struct SetOrKeepSerializer<T: Clone, ST: Serializer<T>> {
inner_serializer: ST,
phantom_t: std::marker::PhantomData<T>,
}
impl<T: Clone, ST: Serializer<T>> SetOrKeepSerializer<T, ST> {
pub fn new(inner_serializer: ST) -> Self {
Self {
inner_serializer,
phantom_t: std::marker::PhantomData,
}
}
}
impl<T: Clone, ST: Serializer<T>> Serializer<SetOrKeep<T>> for SetOrKeepSerializer<T, ST> {
fn serialize(&self, value: &SetOrKeep<T>, buffer: &mut Vec<u8>) -> Result<(), SerializeError> {
match value {
SetOrKeep::Set(value) => {
buffer.push(0);
self.inner_serializer.serialize(value, buffer)?;
Ok(())
}
SetOrKeep::Keep => {
buffer.push(1);
Ok(())
}
}
}
}
impl<T: Clone> Applicable<SetOrKeep<T>> for SetOrKeep<T> {
fn apply(&mut self, other: SetOrKeep<T>) {
if let v @ SetOrKeep::Set(..) = other {
*self = v;
}
}
}
impl<T: Clone> SetOrKeep<T> {
pub fn apply_to(self, val: &mut T) {
if let SetOrKeep::Set(v) = self {
*val = v;
}
}
}
impl<T: Clone> Default for SetOrKeep<T> {
fn default() -> Self {
SetOrKeep::Keep
}
}