use std::fmt::Debug;
use anyhow::Result;
use super::{BlockCipher, PrivateKey, PublicKey, Signature, KEYPAIR_LENGTH, KEY_BYTES_SIZE};
pub trait KeyPairSchema: Sized + PartialEq + Debug + Copy {
type Crypto: BlockCipher;
fn random() -> Self;
fn from_bytes(bytes: &[u8]) -> Result<Self>;
fn from_hex_private_key<S: AsRef<str>>(hex: S) -> Result<Self>;
fn from_private_key(pk: PrivateKey) -> Self;
fn private_key(&self) -> PrivateKey;
fn public_key(&self) -> PublicKey;
fn sign(&self, data: &[u8]) -> Signature;
fn verify(&self, data: &[u8], signature: Signature) -> Result<()>;
fn from_null_private_key(pk: PublicKey) -> Self;
fn to_bytes(&self) -> [u8; KEYPAIR_LENGTH] {
let mut bytes: [u8; KEYPAIR_LENGTH] = [0u8; KEYPAIR_LENGTH];
bytes[..KEY_BYTES_SIZE].copy_from_slice(self.private_key().as_bytes());
bytes[KEY_BYTES_SIZE..].copy_from_slice(self.public_key().as_bytes());
bytes
}
}