module Cardano.Ledger.Api.Tx.Address (
Addr (..),
getNetwork,
BootstrapAddress (..),
serialiseAddr,
decodeAddr,
decodeAddrEither,
decodeAddrShort,
decodeAddrShortEither,
DecAddr (..),
decodeAddrLenient,
decodeAddrLenientEither,
RewardAccount (..),
serialiseRewardAccount,
deserialiseRewardAccount,
) where
import Cardano.Ledger.Address
import Control.Applicative ((<|>))
import Control.Monad.Trans.Fail (runFail, runFailLast)
import Control.Monad.Trans.State.Strict (evalStateT, get)
import qualified Data.ByteString as BS
import Data.ByteString.Short (ShortByteString)
decodeAddrShortEither ::
ShortByteString ->
Either String Addr
decodeAddrShortEither :: ShortByteString -> Either String Addr
decodeAddrShortEither ShortByteString
sbs = Fail String Addr -> Either String Addr
forall e a. (IsString e, Semigroup e) => Fail e a -> Either e a
runFail (Fail String Addr -> Either String Addr)
-> Fail String Addr -> Either String Addr
forall a b. (a -> b) -> a -> b
$ StateT Int (FailT String Identity) Addr -> Int -> Fail String Addr
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (ShortByteString -> StateT Int (FailT String Identity) Addr
forall (m :: * -> *) b.
(MonadFail m, AddressBuffer b) =>
b -> StateT Int m Addr
decodeAddrStateT ShortByteString
sbs) Int
0
{-# INLINE decodeAddrShortEither #-}
decodeAddrShort ::
MonadFail m =>
ShortByteString ->
m Addr
decodeAddrShort :: forall (m :: * -> *). MonadFail m => ShortByteString -> m Addr
decodeAddrShort ShortByteString
sbs = StateT Int m Addr -> Int -> m Addr
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (ShortByteString -> StateT Int m Addr
forall (m :: * -> *) b.
(MonadFail m, AddressBuffer b) =>
b -> StateT Int m Addr
decodeAddrStateT ShortByteString
sbs) Int
0
{-# INLINE decodeAddrShort #-}
data DecAddr
=
DecAddr Addr
|
DecAddrBadPtr Addr
|
DecAddrUnconsumed
Addr
BS.ByteString
deriving (DecAddr -> DecAddr -> Bool
(DecAddr -> DecAddr -> Bool)
-> (DecAddr -> DecAddr -> Bool) -> Eq DecAddr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DecAddr -> DecAddr -> Bool
== :: DecAddr -> DecAddr -> Bool
$c/= :: DecAddr -> DecAddr -> Bool
/= :: DecAddr -> DecAddr -> Bool
Eq, Int -> DecAddr -> ShowS
[DecAddr] -> ShowS
DecAddr -> String
(Int -> DecAddr -> ShowS)
-> (DecAddr -> String) -> ([DecAddr] -> ShowS) -> Show DecAddr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DecAddr -> ShowS
showsPrec :: Int -> DecAddr -> ShowS
$cshow :: DecAddr -> String
show :: DecAddr -> String
$cshowList :: [DecAddr] -> ShowS
showList :: [DecAddr] -> ShowS
Show)
decodeAddrLenient ::
MonadFail m =>
BS.ByteString ->
m Addr
decodeAddrLenient :: forall (m :: * -> *). MonadFail m => ByteString -> m Addr
decodeAddrLenient ByteString
bs = StateT Int m Addr -> Int -> m Addr
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (Bool -> Bool -> ByteString -> StateT Int m Addr
forall (m :: * -> *) b.
(MonadFail m, AddressBuffer b) =>
Bool -> Bool -> b -> StateT Int m Addr
decodeAddrStateLenientT Bool
True Bool
True ByteString
bs) Int
0
decodeAddrLenientEither ::
BS.ByteString ->
Either String DecAddr
decodeAddrLenientEither :: ByteString -> Either String DecAddr
decodeAddrLenientEither ByteString
bs =
Fail String DecAddr -> Either String DecAddr
forall e a. IsString e => Fail e a -> Either e a
runFailLast (Fail String DecAddr -> Either String DecAddr)
-> Fail String DecAddr -> Either String DecAddr
forall a b. (a -> b) -> a -> b
$
(Addr -> DecAddr
DecAddr (Addr -> DecAddr) -> Fail String Addr -> Fail String DecAddr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> Fail String Addr
forall (m :: * -> *). MonadFail m => ByteString -> m Addr
decodeAddr ByteString
bs)
Fail String DecAddr -> Fail String DecAddr -> Fail String DecAddr
forall a.
FailT String Identity a
-> FailT String Identity a -> FailT String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Addr -> DecAddr
DecAddrBadPtr (Addr -> DecAddr) -> Fail String Addr -> Fail String DecAddr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT Int (FailT String Identity) Addr -> Int -> Fail String Addr
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (Bool
-> Bool -> ByteString -> StateT Int (FailT String Identity) Addr
forall (m :: * -> *) b.
(MonadFail m, AddressBuffer b) =>
Bool -> Bool -> b -> StateT Int m Addr
decodeAddrStateLenientT Bool
True Bool
False ByteString
bs) Int
0)
Fail String DecAddr -> Fail String DecAddr -> Fail String DecAddr
forall a.
FailT String Identity a
-> FailT String Identity a -> FailT String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Fail String DecAddr
decodeWithUnconsumed
where
decodeWithUnconsumed :: Fail String DecAddr
decodeWithUnconsumed = (StateT Int (FailT String Identity) DecAddr
-> Int -> Fail String DecAddr)
-> Int
-> StateT Int (FailT String Identity) DecAddr
-> Fail String DecAddr
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT Int (FailT String Identity) DecAddr
-> Int -> Fail String DecAddr
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT Int
0 (StateT Int (FailT String Identity) DecAddr -> Fail String DecAddr)
-> StateT Int (FailT String Identity) DecAddr
-> Fail String DecAddr
forall a b. (a -> b) -> a -> b
$ do
Addr
addr <- Bool
-> Bool -> ByteString -> StateT Int (FailT String Identity) Addr
forall (m :: * -> *) b.
(MonadFail m, AddressBuffer b) =>
Bool -> Bool -> b -> StateT Int m Addr
decodeAddrStateLenientT Bool
False Bool
True ByteString
bs
Int
bytesConsumed <- StateT Int (FailT String Identity) Int
forall (m :: * -> *) s. Monad m => StateT s m s
get
DecAddr -> StateT Int (FailT String Identity) DecAddr
forall a. a -> StateT Int (FailT String Identity) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DecAddr -> StateT Int (FailT String Identity) DecAddr)
-> DecAddr -> StateT Int (FailT String Identity) DecAddr
forall a b. (a -> b) -> a -> b
$ Addr -> ByteString -> DecAddr
DecAddrUnconsumed Addr
addr (Int -> ByteString -> ByteString
BS.drop Int
bytesConsumed ByteString
bs)