feat: Use DecodeOwned for improved ergonomic (#74)

This commit is contained in:
Santiago Carmuega 2022-03-14 18:27:00 -03:00 committed by GitHub
parent 2c500f679e
commit 3eb064502c
7 changed files with 20 additions and 53 deletions

View file

@ -11,20 +11,19 @@ pub trait Fragment: Sized {
fn write_cbor<W: Write>(&self, write: W) -> Result<(), minicbor::encode::Error<W::Error>>; fn write_cbor<W: Write>(&self, write: W) -> Result<(), minicbor::encode::Error<W::Error>>;
} }
#[macro_export] pub trait DecodeOwned: for<'b> minicbor::Decode<'b> {}
macro_rules! impl_fragment {
($Struct:ty) => {
impl $crate::Fragment for $Struct {
fn read_cbor(buffer: &[u8]) -> Result<Self, decode::Error> {
$crate::minicbor::decode(buffer)
}
fn write_cbor<W: encode::Write>( impl<T> DecodeOwned for T where T: for<'b> minicbor::Decode<'b> {}
&self,
write: W, impl<T> Fragment for T
) -> Result<(), encode::Error<W::Error>> { where
$crate::minicbor::encode(self, write) T: DecodeOwned + minicbor::Encode,
} {
} fn read_cbor(buffer: &[u8]) -> Result<Self, minicbor::decode::Error> {
}; minicbor::decode(buffer)
}
fn write_cbor<W: Write>(&self, write: W) -> Result<(), minicbor::encode::Error<W::Error>> {
minicbor::encode(self, write)
}
} }

View file

@ -4,7 +4,6 @@ use crate::machines::{Agent, MachineOutput, Transition};
use crate::common::Point; use crate::common::Point;
use pallas_codec::impl_fragment;
use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}; use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder};
#[derive(Debug, PartialEq, Clone)] #[derive(Debug, PartialEq, Clone)]
@ -90,8 +89,6 @@ impl<'b> Decode<'b> for Message {
} }
} }
impl_fragment!(Message);
pub trait Observer { pub trait Observer {
fn on_block_received(&self, body: Vec<u8>) -> Result<(), Box<dyn std::error::Error>> { fn on_block_received(&self, body: Vec<u8>) -> Result<(), Box<dyn std::error::Error>> {
log::debug!("block received, sice: {}", body.len()); log::debug!("block received, sice: {}", body.len());

View file

@ -1,8 +1,5 @@
use crate::common::Point; use crate::common::Point;
use pallas_codec::{ use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder};
impl_fragment,
minicbor::{decode, encode, Decode, Decoder, Encode, Encoder},
};
use super::{BlockContent, HeaderContent, Message, SkippedContent, Tip}; use super::{BlockContent, HeaderContent, Message, SkippedContent, Tip};
@ -165,8 +162,6 @@ impl Encode for HeaderContent {
} }
} }
impl_fragment!(Message<HeaderContent>);
impl<'b> Decode<'b> for BlockContent { impl<'b> Decode<'b> for BlockContent {
fn decode(d: &mut Decoder<'b>) -> Result<Self, decode::Error> { fn decode(d: &mut Decoder<'b>) -> Result<Self, decode::Error> {
d.tag()?; d.tag()?;
@ -181,8 +176,6 @@ impl Encode for BlockContent {
} }
} }
impl_fragment!(Message<BlockContent>);
impl<'b> Decode<'b> for SkippedContent { impl<'b> Decode<'b> for SkippedContent {
fn decode(d: &mut Decoder<'b>) -> Result<Self, decode::Error> { fn decode(d: &mut Decoder<'b>) -> Result<Self, decode::Error> {
d.skip()?; d.skip()?;
@ -195,5 +188,3 @@ impl Encode for SkippedContent {
todo!() todo!()
} }
} }
impl_fragment!(Message<SkippedContent>);

View file

@ -1,10 +1,7 @@
use core::panic; use core::panic;
use std::collections::HashMap; use std::collections::HashMap;
use pallas_codec::{ use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder};
impl_fragment,
minicbor::{decode, encode, Decode, Decoder, Encode, Encoder},
};
use crate::machines::{Agent, MachineOutput}; use crate::machines::{Agent, MachineOutput};
@ -122,8 +119,6 @@ impl<'b> Decode<'b> for Message {
} }
} }
impl_fragment!(Message);
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum State { pub enum State {
Propose, Propose,

View file

@ -1,10 +1,7 @@
use core::panic; use core::panic;
use std::collections::HashMap; use std::collections::HashMap;
use pallas_codec::{ use pallas_codec::minicbor::{decode, encode, Decode, Encode, Encoder};
impl_fragment,
minicbor::{decode, encode, Decode, Encode, Encoder},
};
use crate::machines::{Agent, MachineOutput}; use crate::machines::{Agent, MachineOutput};
@ -136,8 +133,6 @@ impl<'b> Decode<'b> for Message {
} }
} }
impl_fragment!(Message);
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum State { pub enum State {
Propose, Propose,

View file

@ -1,9 +1,6 @@
use pallas_codec::{ use pallas_codec::minicbor::{data::Cbor, decode, encode, Decode, Decoder, Encode, Encoder};
impl_fragment,
minicbor::{data::Cbor, decode, encode, Decode, Decoder, Encode, Encoder},
};
use super::{Message, Query}; use super::Query;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct BlockQuery {} pub struct BlockQuery {}
@ -69,5 +66,3 @@ impl Query for QueryV10 {
type Request = RequestV10; type Request = RequestV10;
type Response = GenericResponse; type Response = GenericResponse;
} }
impl_fragment!(Message<QueryV10>);

View file

@ -2,10 +2,7 @@ use std::fmt::Debug;
use itertools::Itertools; use itertools::Itertools;
use log::debug; use log::debug;
use pallas_codec::{ use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder};
impl_fragment,
minicbor::{decode, encode, Decode, Decoder, Encode, Encoder},
};
use crate::machines::{Agent, MachineError, MachineOutput, Transition}; 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 /// 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 /// This provider takes a set of tx from a vec as the single, static source of