module Signet.Unstable.Type.AsymmetricSignature where

import qualified Crypto.Error as Error
import qualified Crypto.PubKey.Ed25519 as Ed25519
import qualified Data.ByteArray.Encoding as Encoding
import qualified Data.ByteString as ByteString
import qualified Signet.Unstable.Exception.InvalidAsymmetricSignature as InvalidAsymmetricSignature
import qualified Signet.Unstable.Extra.Either as Either
import qualified Signet.Unstable.Extra.Maybe as Maybe

newtype AsymmetricSignature
  = MkAsymmetricSignature Ed25519.Signature
  deriving (AsymmetricSignature -> AsymmetricSignature -> Bool
(AsymmetricSignature -> AsymmetricSignature -> Bool)
-> (AsymmetricSignature -> AsymmetricSignature -> Bool)
-> Eq AsymmetricSignature
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AsymmetricSignature -> AsymmetricSignature -> Bool
== :: AsymmetricSignature -> AsymmetricSignature -> Bool
$c/= :: AsymmetricSignature -> AsymmetricSignature -> Bool
/= :: AsymmetricSignature -> AsymmetricSignature -> Bool
Eq, Int -> AsymmetricSignature -> ShowS
[AsymmetricSignature] -> ShowS
AsymmetricSignature -> String
(Int -> AsymmetricSignature -> ShowS)
-> (AsymmetricSignature -> String)
-> ([AsymmetricSignature] -> ShowS)
-> Show AsymmetricSignature
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AsymmetricSignature -> ShowS
showsPrec :: Int -> AsymmetricSignature -> ShowS
$cshow :: AsymmetricSignature -> String
show :: AsymmetricSignature -> String
$cshowList :: [AsymmetricSignature] -> ShowS
showList :: [AsymmetricSignature] -> ShowS
Show)

unwrap :: AsymmetricSignature -> Ed25519.Signature
unwrap :: AsymmetricSignature -> Signature
unwrap (MkAsymmetricSignature Signature
signature) = Signature
signature

parse ::
  ByteString.ByteString ->
  Either InvalidAsymmetricSignature.InvalidAsymmetricSignature AsymmetricSignature
parse :: ByteString -> Either InvalidAsymmetricSignature AsymmetricSignature
parse ByteString
encoded = InvalidAsymmetricSignature
-> Maybe AsymmetricSignature
-> Either InvalidAsymmetricSignature AsymmetricSignature
forall e a. e -> Maybe a -> Either e a
Maybe.note (ByteString -> InvalidAsymmetricSignature
InvalidAsymmetricSignature.MkInvalidAsymmetricSignature ByteString
encoded) (Maybe AsymmetricSignature
 -> Either InvalidAsymmetricSignature AsymmetricSignature)
-> Maybe AsymmetricSignature
-> Either InvalidAsymmetricSignature AsymmetricSignature
forall a b. (a -> b) -> a -> b
$ do
  byteString <- Either String ByteString -> Maybe ByteString
forall x a. Either x a -> Maybe a
Either.hush (Either String ByteString -> Maybe ByteString)
-> Either String ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Base -> ByteString -> Either String ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
Base -> bin -> Either String bout
Encoding.convertFromBase Base
Encoding.Base64 ByteString
encoded
  fmap MkAsymmetricSignature
    . Error.maybeCryptoError
    $ Ed25519.signature (byteString :: ByteString.ByteString)

render :: AsymmetricSignature -> ByteString.ByteString
render :: AsymmetricSignature -> ByteString
render = Base -> Signature -> ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
Base -> bin -> bout
Encoding.convertToBase Base
Encoding.Base64 (Signature -> ByteString)
-> (AsymmetricSignature -> Signature)
-> AsymmetricSignature
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AsymmetricSignature -> Signature
unwrap