packages feed

data-serializer 0.3 → 0.3.2

raw patch · 4 files changed

+156/−5 lines, 4 filesdep +splitPVP ok

version bump matches the API change (PVP)

Dependencies added: split

API changes (from Hackage documentation)

+ Data.Deserializer: Deserialized :: α -> Deserialized α
+ Data.Deserializer: Malformed :: [String] -> String -> Deserialized α
+ Data.Deserializer: data Deserialized α
+ Data.Deserializer: defaultDeserializer :: (forall μ. Deserializer μ => μ α) -> ByteString -> Deserialized α
+ Data.Deserializer: deserializeByteString :: Deserializable α => ByteString -> Deserialized α
+ Data.Deserializer: deserializeByteStringAs :: Deserializable α => p α -> ByteString -> Deserialized α
+ Data.Deserializer: deserializeBytes :: Deserializable α => [Word8] -> Deserialized α
+ Data.Deserializer: deserializeBytesAs :: Deserializable α => p α -> [Word8] -> Deserialized α
+ Data.Deserializer: deserializeLazyByteString :: Deserializable α => ByteString -> Deserialized α
+ Data.Deserializer: deserializeLazyByteStringAs :: Deserializable α => p α -> ByteString -> Deserialized α
+ Data.Deserializer: fromByteString :: Deserializable α => ByteString -> Maybe α
+ Data.Deserializer: fromByteStringAs :: Deserializable α => p α -> ByteString -> Maybe α
+ Data.Deserializer: fromBytes :: Deserializable α => [Word8] -> Maybe α
+ Data.Deserializer: fromBytesAs :: Deserializable α => p α -> [Word8] -> Maybe α
+ Data.Deserializer: fromLazyByteString :: Deserializable α => ByteString -> Maybe α
+ Data.Deserializer: fromLazyByteStringAs :: Deserializable α => p α -> ByteString -> Maybe α
+ Data.Deserializer: isDeserialized :: Deserialized α -> Bool
+ Data.Deserializer: isMalformed :: Deserialized α -> Bool
+ Data.Deserializer: maybeDeserialized :: Deserialized α -> Maybe α
+ Data.Serializer: buildByteString :: Builder -> ByteString
+ Data.Serializer: buildBytes :: Builder -> [Word8]
+ Data.Serializer: buildLazyByteString :: Builder -> ByteString
+ Data.Serializer: toByteString :: Serializable α => α -> ByteString
+ Data.Serializer: toBytes :: Serializable α => α -> [Word8]
+ Data.Serializer: toLazyByteString :: Serializable α => α -> ByteString

Files

data-serializer.cabal view
@@ -1,5 +1,5 @@ Name: data-serializer-Version: 0.3+Version: 0.3.2 Category: Data Stability: experimental Synopsis: Common API for serialization libraries@@ -20,7 +20,7 @@ Extra-Source-Files:   README.md -Tested-With: GHC==7.10.3, GHC==8.0.1+Tested-With: GHC==7.10.3, GHC==8.0.2, GHC==8.2.2  Cabal-Version: >= 1.10.0 Build-Type: Simple@@ -38,6 +38,7 @@                , cereal >= 0.4.1                , data-endian >= 0.1.1                , parsers >= 0.12.3+               , split >= 0.2   Hs-Source-Dirs: src   GHC-Options: -Wall   Exposed-Modules:
src/Data/Deserializer.hs view
@@ -48,12 +48,30 @@   , BigEndianDeserializer(..)   , deserializeIn   , deserializeH+  -- ** Default deserializer+  , Deserialized(..)+  , isDeserialized+  , isMalformed+  , maybeDeserialized+  , defaultDeserializer   -- * Deserializable types   , Deserializable(..)   , getIn   , getL   , getB   , getH+  , deserializeBytes+  , deserializeBytesAs+  , deserializeByteString+  , deserializeByteStringAs+  , deserializeLazyByteString+  , deserializeLazyByteStringAs+  , fromBytes+  , fromBytesAs+  , fromByteString+  , fromByteStringAs+  , fromLazyByteString+  , fromLazyByteStringAs   , RestDeserializable(..)   ) where @@ -74,6 +92,7 @@ import qualified Data.Binary.Get as B import qualified Data.Binary.Get.Internal as B import qualified Data.Serialize.Get as S+import Data.List.Split (splitOn) import Text.Parser.Combinators import Text.Parser.LookAhead import Control.Applicative (Applicative(..), Alternative,@@ -624,6 +643,36 @@ deserializeH = deserializeL #endif +-- | Deserialization result.+data Deserialized α = Deserialized α+                    | Malformed [String] String++-- | Map 'Deserialized' to 'True' and 'Malformed' to 'False'.+isDeserialized ∷ Deserialized α → Bool+isDeserialized (Deserialized _) = True+isDeserialized (Malformed _ _)  = False++-- | Map 'Deserialized' to 'False' and 'Malformed' to 'True'.+isMalformed ∷ Deserialized α → Bool+isMalformed (Deserialized _) = False+isMalformed (Malformed _ _)  = True++-- | Map 'Deserialized' values to 'Just' and 'Malformed' to 'Nothing'.+maybeDeserialized ∷ Deserialized α → Maybe α+maybeDeserialized (Deserialized a) = Just a+maybeDeserialized (Malformed _ _)  = Nothing++-- | Deserialize a 'LBS.ByteString' via the default deserializer.+defaultDeserializer ∷ (∀ μ . Deserializer μ ⇒ μ α) → LBS.ByteString+                    → Deserialized α+defaultDeserializer m i = case B.runGetOrFail (binaryDeserializer m) i of+  Left (_, _, e) → case splitOn "\n" e of+    []  → Malformed [] e+    [_] → Malformed [] e+    es  → Malformed (init es) (last es)+  Right (_, _, a) →+    Deserialized a+ -- | Deserializable type. 'get' must not rely on 'eof'. class Deserializable α where   get ∷ Deserializer μ ⇒ μ α@@ -727,6 +776,74 @@ getH = getL #endif {-# INLINE getH #-}++-- | Deserialize a value of type @α@ from a list of bytes via+-- the 'defaultDeserializer'.+deserializeBytes ∷ Deserializable α ⇒ [Word8] → Deserialized α+deserializeBytes = defaultDeserializer get . LBS.pack+{-# INLINE deserializeBytes #-}++-- | Provide a hint for the type system when using 'deserializeBytes'.+deserializeBytesAs ∷ Deserializable α ⇒ p α → [Word8] → Deserialized α+deserializeBytesAs _ = deserializeBytes+{-# INLINE deserializeBytesAs #-}++-- | Deserialize a value of type @α@ from a 'BS.ByteString' via+-- the 'defaultDeserializer'.+deserializeByteString ∷ Deserializable α+                      ⇒ BS.ByteString → Deserialized α+deserializeByteString = defaultDeserializer get . LBS.fromStrict+{-# INLINE deserializeByteString #-}++-- | Provide a hint for the type system when using 'deserializeByteString'.+deserializeByteStringAs ∷ Deserializable α+                        ⇒ p α → BS.ByteString → Deserialized α+deserializeByteStringAs _ = deserializeByteString+{-# INLINE deserializeByteStringAs #-}++-- | Deserialize a value of type @α@ from a 'LBS.ByteString' via+-- the 'defaultDeserializer'.+deserializeLazyByteString ∷ Deserializable α+                          ⇒ LBS.ByteString → Deserialized α+deserializeLazyByteString = defaultDeserializer get+{-# INLINE deserializeLazyByteString #-}++-- | Provide a hint for the type system when using+-- 'deserializeLazyByteString'.+deserializeLazyByteStringAs ∷ Deserializable α+                            ⇒ p α → LBS.ByteString → Deserialized α+deserializeLazyByteStringAs _ = deserializeLazyByteString+{-# INLINE deserializeLazyByteStringAs #-}++-- | A shorthand for @'maybeDeserialized' . 'deserializeBytes'@.+fromBytes ∷ Deserializable α ⇒ [Word8] → Maybe α+fromBytes = maybeDeserialized . deserializeBytes+{-# INLINE fromBytes #-}++-- | Provide a hint for the type system when using 'fromBytes'+fromBytesAs ∷ Deserializable α ⇒ p α → [Word8] → Maybe α+fromBytesAs _ = fromBytes+{-# INLINE fromBytesAs #-}++-- | A shorthand for @'maybeDeserialized' . 'deserializeByteString'@.+fromByteString ∷ Deserializable α ⇒ BS.ByteString → Maybe α+fromByteString = maybeDeserialized . deserializeByteString+{-# INLINE fromByteString #-}++-- | Provide a hint for the type system when using 'fromByteString'+fromByteStringAs ∷ Deserializable α ⇒ p α → BS.ByteString → Maybe α+fromByteStringAs _ = fromByteString+{-# INLINE fromByteStringAs #-}++-- | A shorthand for @'maybeDeserialized' . 'deserializeLazyByteString'@.+fromLazyByteString ∷ Deserializable α ⇒ LBS.ByteString → Maybe α+fromLazyByteString = maybeDeserialized . deserializeLazyByteString+{-# INLINE fromLazyByteString #-}++-- | Provide a hint for the type system when using 'fromLazyByteString'+fromLazyByteStringAs ∷ Deserializable α ⇒ p α → LBS.ByteString → Maybe α+fromLazyByteStringAs _ = fromLazyByteString+{-# INLINE fromLazyByteStringAs #-}  -- | Deserializable type. 'getRest' must consume all the remaining input --   or fail.
src/Data/Serializer.hs view
@@ -12,6 +12,9 @@   (   -- * Serialization monoid     Serializer(..)+  , buildBytes+  , buildByteString+  , buildLazyByteString   , BinarySerializer(..)   , CerealSerializer(..)   -- ** Binary words serialization@@ -50,6 +53,9 @@   , putL   , putB   , putH+  , toBytes+  , toByteString+  , toLazyByteString   , SizedSerializable(..)   , RestSerializable(..)   ) where@@ -176,6 +182,20 @@   builder = id   {-# INLINE builder #-} +-- | A shorthand for @"LBS.unpack' . 'BB.toLazyByteString'@.+buildBytes ∷ BB.Builder → [Word8]+buildBytes = LBS.unpack . BB.toLazyByteString++-- | A shorthand for @'LBS.toStrict' . 'BB.toLazyByteString'@.+buildByteString ∷ BB.Builder → BS.ByteString+buildByteString = LBS.toStrict . BB.toLazyByteString+{-# INLINE buildByteString #-}++-- | An alias for @'BB.toLazyByteString'@.+buildLazyByteString ∷ BB.Builder → LBS.ByteString+buildLazyByteString = BB.toLazyByteString+{-# INLINE buildLazyByteString #-}+ #if MIN_VERSION_base(4,9,0) && MIN_VERSION_binary(0,8,3) instance Serializer B.Put where   word8 = B.putWord8@@ -656,6 +676,21 @@ putH ∷ (Serializer s, Serializable α) ⇒ α → s putH a = serializeH (put a) {-# INLINE putH #-}++-- | A shorthand for @'buildBytes' . 'put'@.+toBytes ∷ Serializable α ⇒ α → [Word8]+toBytes = buildBytes . put+{-# INLINE toBytes #-}++-- | A shorthand for @'buildByteString' . 'put'@.+toByteString ∷ Serializable α ⇒ α → BS.ByteString+toByteString = buildByteString . put+{-# INLINE toByteString #-}++-- | A shorthand for @'buildLazyByteString' . 'put'@.+toLazyByteString ∷ Serializable α ⇒ α → LBS.ByteString+toLazyByteString = BB.toLazyByteString . put+{-# INLINE toLazyByteString #-}  -- | Types with fixed serialized size. class Serializable α ⇒ SizedSerializable α where
tests/Tests.hs view
@@ -11,7 +11,6 @@ import Data.Either (isLeft, isRight) import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS-import qualified Data.ByteString.Builder as BB import qualified Data.Binary.Put as B import qualified Data.Binary.Get as B import qualified Data.Serialize.Put as C@@ -22,7 +21,6 @@ import qualified Data.Deserializer as D import Control.Applicative ((<|>)) -byteStringBuilder = LBS.unpack . BB.toLazyByteString binaryBuilder = LBS.unpack . B.runPut . S.binarySerializer cerealBuilder = LBS.unpack . C.runPutLazy . S.cerealSerializer @@ -69,7 +67,7 @@ main = defaultMain      $ testGroup "Tests"          [ testGroup "Serializers"-             [ serializerTests "Builder" byteStringBuilder+             [ serializerTests "Builder" S.buildBytes              , serializerTests "Binary.Put" binaryBuilder              , serializerTests "Cereal.Put" cerealBuilder              ]