module Data.Serialize.Describe.Descriptor(
DescriptorM,
Descriptor,
serialize,
deserialize,
deserializeEx,
unwrapGet,
unwrapPut,
morphRef,
morphTransformer,
isolate,
lookAhead,
cursor
) where
import Control.Exception
import Data.ByteString (ByteString)
import Data.Serialize.Get hiding (isolate)
import Data.Serialize.Put
import Data.Serialize.Describe.Internal.Descriptor
import Control.Monad.Trans.Identity
serialize :: s -> Descriptor s a -> ByteString
serialize s = snd . runPutM . runIdentityT . unwrapPut s
deserialize :: ByteString -> Descriptor s s -> Either String s
deserialize bs = flip runGet bs . runIdentityT . unwrapGet
newtype ParserException = ParserException String
deriving (Show)
instance Exception ParserException
deserializeEx :: ByteString -> Descriptor s s -> s
deserializeEx bs d = case deserialize bs d of
Left err -> throw $ ParserException err
Right a -> a