From 3336d4d4467f5b7efeba14484d0368f9e7ebfbd5 Mon Sep 17 00:00:00 2001 From: Santiago Carmuega Date: Mon, 14 Mar 2022 18:27:00 -0300 Subject: [PATCH] feat: Use DecodeOwned for improved ergonomic (#74) --- pallas-codec/src/lib.rs | 29 +++++++++---------- pallas-miniprotocols/src/blockfetch/mod.rs | 3 -- pallas-miniprotocols/src/chainsync/codec.rs | 11 +------ pallas-miniprotocols/src/handshake/n2c.rs | 7 +---- pallas-miniprotocols/src/handshake/n2n.rs | 7 +---- .../src/localstate/queries.rs | 9 ++---- pallas-miniprotocols/src/txsubmission/mod.rs | 7 +---- 7 files changed, 20 insertions(+), 53 deletions(-) diff --git a/pallas-codec/src/lib.rs b/pallas-codec/src/lib.rs index c538542..7177cfd 100644 --- a/pallas-codec/src/lib.rs +++ b/pallas-codec/src/lib.rs @@ -11,20 +11,19 @@ pub trait Fragment: Sized { fn write_cbor(&self, write: W) -> Result<(), minicbor::encode::Error>; } -#[macro_export] -macro_rules! impl_fragment { - ($Struct:ty) => { - impl $crate::Fragment for $Struct { - fn read_cbor(buffer: &[u8]) -> Result { - $crate::minicbor::decode(buffer) - } +pub trait DecodeOwned: for<'b> minicbor::Decode<'b> {} - fn write_cbor( - &self, - write: W, - ) -> Result<(), encode::Error> { - $crate::minicbor::encode(self, write) - } - } - }; +impl DecodeOwned for T where T: for<'b> minicbor::Decode<'b> {} + +impl Fragment for T +where + T: DecodeOwned + minicbor::Encode, +{ + fn read_cbor(buffer: &[u8]) -> Result { + minicbor::decode(buffer) + } + + fn write_cbor(&self, write: W) -> Result<(), minicbor::encode::Error> { + minicbor::encode(self, write) + } } diff --git a/pallas-miniprotocols/src/blockfetch/mod.rs b/pallas-miniprotocols/src/blockfetch/mod.rs index e35c984..b69d9ce 100644 --- a/pallas-miniprotocols/src/blockfetch/mod.rs +++ b/pallas-miniprotocols/src/blockfetch/mod.rs @@ -4,7 +4,6 @@ use crate::machines::{Agent, MachineOutput, Transition}; use crate::common::Point; -use pallas_codec::impl_fragment; use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}; #[derive(Debug, PartialEq, Clone)] @@ -90,8 +89,6 @@ impl<'b> Decode<'b> for Message { } } -impl_fragment!(Message); - pub trait Observer { fn on_block_received(&self, body: Vec) -> Result<(), Box> { log::debug!("block received, sice: {}", body.len()); diff --git a/pallas-miniprotocols/src/chainsync/codec.rs b/pallas-miniprotocols/src/chainsync/codec.rs index 5a7923a..c29c8c7 100644 --- a/pallas-miniprotocols/src/chainsync/codec.rs +++ b/pallas-miniprotocols/src/chainsync/codec.rs @@ -1,8 +1,5 @@ use crate::common::Point; -use pallas_codec::{ - impl_fragment, - minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}, -}; +use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}; use super::{BlockContent, HeaderContent, Message, SkippedContent, Tip}; @@ -165,8 +162,6 @@ impl Encode for HeaderContent { } } -impl_fragment!(Message); - impl<'b> Decode<'b> for BlockContent { fn decode(d: &mut Decoder<'b>) -> Result { d.tag()?; @@ -181,8 +176,6 @@ impl Encode for BlockContent { } } -impl_fragment!(Message); - impl<'b> Decode<'b> for SkippedContent { fn decode(d: &mut Decoder<'b>) -> Result { d.skip()?; @@ -195,5 +188,3 @@ impl Encode for SkippedContent { todo!() } } - -impl_fragment!(Message); diff --git a/pallas-miniprotocols/src/handshake/n2c.rs b/pallas-miniprotocols/src/handshake/n2c.rs index 2f001b5..535169f 100644 --- a/pallas-miniprotocols/src/handshake/n2c.rs +++ b/pallas-miniprotocols/src/handshake/n2c.rs @@ -1,10 +1,7 @@ use core::panic; use std::collections::HashMap; -use pallas_codec::{ - impl_fragment, - minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}, -}; +use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}; use crate::machines::{Agent, MachineOutput}; @@ -122,8 +119,6 @@ impl<'b> Decode<'b> for Message { } } -impl_fragment!(Message); - #[derive(Debug, PartialEq, Eq)] pub enum State { Propose, diff --git a/pallas-miniprotocols/src/handshake/n2n.rs b/pallas-miniprotocols/src/handshake/n2n.rs index 1820abb..e5ce6ed 100644 --- a/pallas-miniprotocols/src/handshake/n2n.rs +++ b/pallas-miniprotocols/src/handshake/n2n.rs @@ -1,10 +1,7 @@ use core::panic; use std::collections::HashMap; -use pallas_codec::{ - impl_fragment, - minicbor::{decode, encode, Decode, Encode, Encoder}, -}; +use pallas_codec::minicbor::{decode, encode, Decode, Encode, Encoder}; use crate::machines::{Agent, MachineOutput}; @@ -136,8 +133,6 @@ impl<'b> Decode<'b> for Message { } } -impl_fragment!(Message); - #[derive(Debug, PartialEq, Eq)] pub enum State { Propose, diff --git a/pallas-miniprotocols/src/localstate/queries.rs b/pallas-miniprotocols/src/localstate/queries.rs index d79027c..f5b1972 100644 --- a/pallas-miniprotocols/src/localstate/queries.rs +++ b/pallas-miniprotocols/src/localstate/queries.rs @@ -1,9 +1,6 @@ -use pallas_codec::{ - impl_fragment, - minicbor::{data::Cbor, decode, encode, Decode, Decoder, Encode, Encoder}, -}; +use pallas_codec::minicbor::{data::Cbor, decode, encode, Decode, Decoder, Encode, Encoder}; -use super::{Message, Query}; +use super::Query; #[derive(Debug, Clone)] pub struct BlockQuery {} @@ -69,5 +66,3 @@ impl Query for QueryV10 { type Request = RequestV10; type Response = GenericResponse; } - -impl_fragment!(Message); diff --git a/pallas-miniprotocols/src/txsubmission/mod.rs b/pallas-miniprotocols/src/txsubmission/mod.rs index 2b823e4..4800803 100644 --- a/pallas-miniprotocols/src/txsubmission/mod.rs +++ b/pallas-miniprotocols/src/txsubmission/mod.rs @@ -2,10 +2,7 @@ use std::fmt::Debug; use itertools::Itertools; use log::debug; -use pallas_codec::{ - impl_fragment, - minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}, -}; +use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}; use crate::machines::{Agent, MachineError, MachineOutput, Transition}; @@ -142,8 +139,6 @@ impl<'b> Decode<'b> for Message { } } -impl_fragment!(Message); - /// A very basic tx provider agent with a fixed set of tx to submit /// /// This provider takes a set of tx from a vec as the single, static source of