use crate::{
curves::{FpParameters, Group, MontgomeryModelParameters, PrimeField, ProjectiveCurve, TEModelParameters},
dpc::Record,
};
use snarkvm_errors::dpc::DPCError;
pub trait RecordSerializerScheme {
type Group: Group + ProjectiveCurve;
type InnerField: PrimeField;
type OuterField: PrimeField;
type Parameters: MontgomeryModelParameters + TEModelParameters;
type Record: Record;
type DeserializedRecord;
const SCALAR_FIELD_BITSIZE: usize =
<<Self::Group as Group>::ScalarField as PrimeField>::Parameters::MODULUS_BITS as usize;
const INNER_FIELD_BITSIZE: usize = <Self::InnerField as PrimeField>::Parameters::MODULUS_BITS as usize;
const OUTER_FIELD_BITSIZE: usize = <Self::OuterField as PrimeField>::Parameters::MODULUS_BITS as usize;
const DATA_ELEMENT_BITSIZE: usize = Self::INNER_FIELD_BITSIZE - 1;
const PAYLOAD_ELEMENT_BITSIZE: usize = Self::DATA_ELEMENT_BITSIZE - 1;
fn serialize(record: &Self::Record) -> Result<(Vec<Self::Group>, bool), DPCError>;
fn deserialize(
serialized_record: Vec<Self::Group>,
final_fq_high_bit: bool,
) -> Result<Self::DeserializedRecord, DPCError>;
}