module Quantex.Codec (
  Codec (..),
) where

import Data.ByteString (ByteString)
import Quantex.Error (QuantexError)
import Quantex.Internal.KEM qualified as KEM
import Quantex.Internal.Sign qualified as Sign

class Codec a where
  encode :: a -> ByteString
  decode :: ByteString -> Either QuantexError a

instance KEM.KEM a => Codec (KEM.PublicKey a) where
  encode :: PublicKey a -> ByteString
encode = PublicKey a -> ByteString
forall a. PublicKey a -> ByteString
KEM.publicKeyBytes
  decode :: ByteString -> Either QuantexError (PublicKey a)
decode = ByteString -> Either QuantexError (PublicKey a)
forall a. KEM a => ByteString -> Either QuantexError (PublicKey a)
KEM.publicKey

instance KEM.KEM a => Codec (KEM.Ciphertext a) where
  encode :: Ciphertext a -> ByteString
encode = Ciphertext a -> ByteString
forall a. Ciphertext a -> ByteString
KEM.ciphertextBytes
  decode :: ByteString -> Either QuantexError (Ciphertext a)
decode = ByteString -> Either QuantexError (Ciphertext a)
forall a. KEM a => ByteString -> Either QuantexError (Ciphertext a)
KEM.ciphertext

instance Sign.DSA a => Codec (Sign.PublicKey a) where
  encode :: PublicKey a -> ByteString
encode = PublicKey a -> ByteString
forall a. PublicKey a -> ByteString
Sign.publicKeyBytes
  decode :: ByteString -> Either QuantexError (PublicKey a)
decode = ByteString -> Either QuantexError (PublicKey a)
forall a. DSA a => ByteString -> Either QuantexError (PublicKey a)
Sign.publicKey

instance Sign.DSA a => Codec (Sign.Signature a) where
  encode :: Signature a -> ByteString
encode = Signature a -> ByteString
forall a. Signature a -> ByteString
Sign.signatureBytes
  decode :: ByteString -> Either QuantexError (Signature a)
decode = ByteString -> Either QuantexError (Signature a)
forall a. DSA a => ByteString -> Either QuantexError (Signature a)
Sign.signature