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 +3/−2
- src/Data/Deserializer.hs +117/−0
- src/Data/Serializer.hs +35/−0
- tests/Tests.hs +1/−3
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 ]