Skip to content

Commit

Permalink
jormungandr-lib: add FragmentDef to use serde on fragments
Browse files Browse the repository at this point in the history
  • Loading branch information
eugene-babichenko committed Apr 30, 2021
1 parent 6185c33 commit db43812
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
95 changes: 95 additions & 0 deletions jormungandr-lib/src/interfaces/fragment.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
use chain_impl_mockchain::fragment::Fragment;

use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde_with::{DeserializeAs, SerializeAs};

#[derive(Debug)]
pub struct FragmentDef(Fragment);

impl From<Fragment> for FragmentDef {
fn from(fragment: Fragment) -> Self {
Self(fragment)
}
}

impl From<FragmentDef> for Fragment {
fn from(fragment_def: FragmentDef) -> Self {
fragment_def.0
}
}

impl FragmentDef {
pub fn deserialize<'de, D>(deserializer: D) -> Result<Fragment, D::Error>
where
D: Deserializer<'de>,
{
<Self as Deserialize>::deserialize(deserializer).map(|fragment_def| fragment_def.0)
}

pub fn serialize<S>(fragment: &Fragment, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize_fragment(&fragment, serializer)
}
}

impl<'de> Deserialize<'de> for FragmentDef {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let bytes = if deserializer.is_human_readable() {
let h = String::deserialize(deserializer)?;
hex::decode(&h).map_err(serde::de::Error::custom)?
} else {
Vec::<u8>::deserialize(deserializer)?
};

let fragment = <Fragment as chain_core::property::Deserialize>::deserialize(bytes.as_ref())
.map_err(serde::de::Error::custom)?;

Ok(FragmentDef(fragment))
}
}

impl Serialize for FragmentDef {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize_fragment(&self.0, serializer)
}
}

impl<'de> DeserializeAs<'de, Fragment> for FragmentDef {
fn deserialize_as<D>(deserializer: D) -> Result<Fragment, D::Error>
where
D: Deserializer<'de>,
{
Self::deserialize(deserializer)
}
}

impl SerializeAs<Fragment> for FragmentDef {
fn serialize_as<S>(source: &Fragment, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize_fragment(source, serializer)
}
}

fn serialize_fragment<S>(fragment: &Fragment, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let bytes = <Fragment as chain_core::property::Serialize>::serialize_as_vec(fragment)
.map_err(serde::ser::Error::custom)?;

if serializer.is_human_readable() {
serializer.serialize_str(&hex::encode(&bytes))
} else {
serializer.serialize_bytes(&bytes)
}
}
2 changes: 2 additions & 0 deletions jormungandr-lib/src/interfaces/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod blockdate;
mod certificate;
mod committee;
mod config;
mod fragment;
mod fragment_log;
mod leadership_log;
mod linear_fee;
Expand Down Expand Up @@ -38,6 +39,7 @@ pub use self::certificate::{
};
pub use self::committee::CommitteeIdDef;
pub use self::config::*;
pub use self::fragment::FragmentDef;
pub use self::fragment_log::{FragmentLog, FragmentOrigin, FragmentStatus};
pub use self::leadership_log::{
EnclaveLeaderId, LeadershipLog, LeadershipLogId, LeadershipLogStatus,
Expand Down

0 comments on commit db43812

Please sign in to comment.