use std::io::Write;
use crate::compat::{CSCurve, SerializablePoint};
use ecdsa::elliptic_curve::ScalarPrimitive;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn encode<T: Serialize>(val: &T) -> Vec<u8> {
rmp_serde::encode::to_vec(val).expect("failed to encode value")
}
pub fn encode_writer<T: Serialize, W: Write>(w: &mut W, val: &T) {
rmp_serde::encode::write(w, val).expect("failed to encode value");
}
pub fn serialize_projective_points<C: CSCurve, S: Serializer>(
data: &[C::ProjectivePoint],
serializer: S,
) -> Result<S::Ok, S::Error> {
serializer.collect_seq(data.iter().map(SerializablePoint::<C>::from_projective))
}
pub fn deserialize_projective_points<'de, C, D>(
deserializer: D,
) -> Result<Vec<C::ProjectivePoint>, D::Error>
where
C: CSCurve,
D: Deserializer<'de>,
{
let points: Vec<SerializablePoint<C>> = Deserialize::deserialize(deserializer)?;
Ok(points.into_iter().map(|p| p.to_projective()).collect())
}
pub fn serialize_projective_point<C: CSCurve, S: Serializer>(
data: &C::ProjectivePoint,
serializer: S,
) -> Result<S::Ok, S::Error> {
SerializablePoint::<C>::from_projective(data).serialize(serializer)
}
pub fn serialize_scalar<C: CSCurve, S: Serializer>(
data: &C::Scalar,
serializer: S,
) -> Result<S::Ok, S::Error> {
let data: ScalarPrimitive<C> = (*data).into();
data.serialize(serializer)
}
pub fn deserialize_scalar<'de, C, D>(deserializer: D) -> Result<C::Scalar, D::Error>
where
C: CSCurve,
D: Deserializer<'de>,
{
let out: ScalarPrimitive<C> = ScalarPrimitive::deserialize(deserializer)?;
Ok(out.into())
}