describe 0.2.0.4 → 0.2.0.5
raw patch · 4 files changed
+31/−2 lines, 4 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Data.Serialize.Describe.Combinators: Remaining :: ByteString -> Remaining
+ Data.Serialize.Describe.Combinators: [unwrapRemaining] :: Remaining -> ByteString
+ Data.Serialize.Describe.Combinators: instance Data.Serialize.Describe.Class.Describe Data.Serialize.Describe.Combinators.Remaining
+ Data.Serialize.Describe.Combinators: newtype Remaining
+ Data.Serialize.Describe.Descriptor: deserializeEx :: ByteString -> Descriptor s s -> s
+ Data.Serialize.Describe.Descriptor: instance GHC.Exception.Type.Exception Data.Serialize.Describe.Descriptor.ParserException
+ Data.Serialize.Describe.Descriptor: instance GHC.Show.Show Data.Serialize.Describe.Descriptor.ParserException
Files
- CHANGELOG.md +5/−0
- describe.cabal +2/−1
- src/Data/Serialize/Describe/Combinators.hs +9/−0
- src/Data/Serialize/Describe/Descriptor.hs +15/−1
CHANGELOG.md view
@@ -1,5 +1,10 @@ # Revision history for describe +## 0.2.0.5 -- 2019-10-07++* Added the `Remaining` combinator.+* Added `deserializeEx`.+ ## 0.2.0.4 -- 2019-10-06 * Made Vec instance for Equals overlapping.
describe.cabal view
@@ -3,7 +3,7 @@ -- For further documentation, see http://haskell.org/cabal/users-guide/ name: describe-version: 0.2.0.4+version: 0.2.0.5 synopsis: Combinators for describing binary data structures description: Combinators for describing binary data structures, which eliminate the boilerplate of having to write isomorphic Get and Put instances. Please see the Github page for examples. homepage: https://github.com/riugabachi/describe@@ -26,6 +26,7 @@ TypeFamilies, TypeOperators, OverlappingInstances,+ GeneralizedNewtypeDeriving, FlexibleContexts, DefaultSignatures, DataKinds,
src/Data/Serialize/Describe/Combinators.hs view
@@ -1,5 +1,6 @@ -- | Various type-level combinators to ease generic derivation of 'Describe' module Data.Serialize.Describe.Combinators(+ Remaining(..), Optional(..), Predicate(..), Equals@@ -8,11 +9,19 @@ import GHC.TypeNats import Data.Proxy import Data.Maybe+import Data.ByteString import Data.Serialize.Describe.Descriptor import Data.Serialize.Describe.Class import qualified Data.Vector.Fixed as V import Data.Vector.Fixed.Boxed (Vec) import qualified Data.Serialize.Get as G+import qualified Data.Serialize.Put as P++-- | A 'Remaining' represents the rest of the buffer. Upon serialization, the entire wrapped ByteString will be written.+newtype Remaining = Remaining { unwrapRemaining :: ByteString }++instance Describe Remaining where+ describe f = Descriptor (fmap Remaining . G.getByteString =<< G.remaining, \s -> P.putByteString (unwrapRemaining (f s)) >> pure (f s)) -- | An 'Optional' represents a field which is optionally-serializable. The field will be parsed via a lookAhead and, if the value matches the 'Predicate' p, then the field exists. If not, it is assumed as though the field was never serialized in the first place and the value will be set to 'Nothing'; parsing will then continue on as usual. newtype Optional p t = Optional { unwrapOptional :: Maybe t }
src/Data/Serialize/Describe/Descriptor.hs view
@@ -3,8 +3,11 @@ unwrapGet, unwrapPut, serialize,- deserialize+ deserialize,+ deserializeEx ) where++import Control.Exception import Data.ByteString (ByteString) import Data.Serialize.Get import Data.Serialize.Put@@ -29,6 +32,17 @@ -- | Convenience function for @flip runGet bs . unwrapGet@ deserialize :: ByteString -> Descriptor s s -> Either String s deserialize bs = flip runGet bs . unwrapGet++newtype ParserException = ParserException String+ deriving (Show)++instance Exception ParserException++-- | Like 'deserialize', but throw a 'ParserException' upon failure rather than an `Either`.+deserializeEx :: ByteString -> Descriptor s s -> s+deserializeEx bs d = case deserialize bs d of+ Left err -> throw $ ParserException err+ Right a -> a instance Functor (Descriptor s) where fmap f (Descriptor (g, p)) = Descriptor (f <$> g, (f <$>) . p)