use std::{
fmt::{Debug, Display},
str::FromStr,
};
use bincode::Options;
use bytes::Bytes;
use serde::{de::DeserializeOwned, Deserialize, Serialize};
pub mod asstr;
pub mod hex;
pub mod hex32;
pub mod hexvec;
pub mod try_asstr;
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord)]
#[serde(transparent)]
pub struct SerializeAsString<T: Display + FromStr + Serialize + DeserializeOwned>(
#[serde(with = "crate::asstr")] pub T,
)
where
T::Err: Debug;
pub fn deserialize<T: DeserializeOwned>(bts: &[u8]) -> bincode::Result<T> {
bincode::DefaultOptions::new()
.with_varint_encoding()
.reject_trailing_bytes()
.with_limit(bts.len() as u64)
.deserialize(bts)
}
pub fn serialize<T: Serialize>(v: &T) -> bincode::Result<Vec<u8>> {
bincode::DefaultOptions::new()
.with_varint_encoding()
.reject_trailing_bytes()
.serialize(v)
}
pub trait StdcodeSerializeExt: Serialize + Sized {
fn stdcode(&self) -> Vec<u8> {
serialize(self).unwrap()
}
}
impl<T: Serialize + Sized> StdcodeSerializeExt for T {}
#[derive(Serialize, Deserialize, Clone)]
#[serde(transparent)]
#[repr(transparent)]
pub struct HexBytesInner(#[serde(with = "crate::hex")] Vec<u8>);
impl<T: AsRef<[u8]>> From<T> for HexBytesInner {
fn from(s: T) -> Self {
HexBytesInner(s.as_ref().to_vec())
}
}
impl From<HexBytesInner> for Vec<u8> {
fn from(t: HexBytesInner) -> Self {
t.0
}
}
impl From<HexBytesInner> for Bytes {
fn from(t: HexBytesInner) -> Self {
t.0.into()
}
}
pub type HexBytes = serde_with::FromInto<HexBytesInner>;