use core::fmt;
#[cfg(feature = "dev")]
use arbitrary::Arbitrary;
use ed25519_dalek::Signature;
use ufotofu::codec_prelude::*;
wrapper! {
#[derive(PartialEq, Eq, Clone)]
SubspaceSignature; Signature
}
impl fmt::Debug for SubspaceSignature {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl From<[u8; Signature::BYTE_SIZE]> for SubspaceSignature {
fn from(value: [u8; Signature::BYTE_SIZE]) -> Self {
Self(Signature::from(value))
}
}
#[cfg(feature = "dev")]
impl<'a> Arbitrary<'a> for SubspaceSignature {
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
Ok(Self(Signature::from_bytes(&Arbitrary::arbitrary(u)?)))
}
}
impl Encodable for SubspaceSignature {
async fn encode<C>(&self, consumer: &mut C) -> Result<(), C::Error>
where
C: BulkConsumer<Item = u8> + ?Sized,
{
consumer
.consume_full_slice(&self.0.to_bytes())
.await
.map_err(|err| err.reason)
}
}
impl EncodableKnownLength for SubspaceSignature {
fn len_of_encoding(&self) -> usize {
Signature::BYTE_SIZE
}
}
impl Decodable for SubspaceSignature {
type ErrorReason = Infallible;
async fn decode<P>(
producer: &mut P,
) -> Result<Self, DecodeError<P::Final, P::Error, Self::ErrorReason>>
where
P: BulkProducer<Item = u8> + ?Sized,
Self: Sized,
{
let mut buf = [0; Signature::BYTE_SIZE];
producer.overwrite_full_slice(&mut buf).await?;
Ok(Self(Signature::from_bytes(&buf)))
}
}
impl DecodableCanonic for SubspaceSignature {
type ErrorCanonic = Infallible;
async fn decode_canonic<P>(
producer: &mut P,
) -> Result<Self, DecodeError<P::Final, P::Error, Self::ErrorCanonic>>
where
P: BulkProducer<Item = u8> + ?Sized,
Self: Sized,
{
Self::decode(producer).await
}
}