msgpack 0.6.0.1 → 0.6.1
raw patch · 5 files changed
+96/−26 lines, 5 filesdep +textPVP ok
version bump matches the API change (PVP)
Dependencies added: text
API changes (from Hackage documentation)
+ Data.MessagePack.Object: instance [incoherent] OBJECT Text
+ Data.MessagePack.Pack: instance [incoherent] Packable Text
+ Data.MessagePack.Unpack: instance [incoherent] Unpackable Text
Files
- msgpack.cabal +5/−1
- src/Data/MessagePack/Internal/Utf8.hs +28/−0
- src/Data/MessagePack/Object.hs +24/−4
- src/Data/MessagePack/Pack.hs +22/−11
- src/Data/MessagePack/Unpack.hs +17/−10
msgpack.cabal view
@@ -1,5 +1,5 @@ Name: msgpack-Version: 0.6.0.1+Version: 0.6.1 Synopsis: A Haskell implementation of MessagePack Description: A Haskell implementation of MessagePack <http://msgpack.org/>@@ -23,6 +23,7 @@ Build-depends: base >=4 && <5, transformers >= 0.2 && < 0.3, bytestring >= 0.9 && < 0.10,+ text >= 0.11 && < 0.12, vector >= 0.7 && < 0.8, attoparsec >= 0.8 && < 0.9, binary >= 0.5.0 && < 0.5.1,@@ -40,6 +41,9 @@ Data.MessagePack.Unpack Data.MessagePack.Object Data.MessagePack.Derive++ Other-modules:+ Data.MessagePack.Internal.Utf8 Source-repository head Type: git
+ src/Data/MessagePack/Internal/Utf8.hs view
@@ -0,0 +1,28 @@+module Data.MessagePack.Internal.Utf8 (+ encodeUtf8,+ decodeUtf8,+ skipChar,+ toLBS,+ fromLBS,+ ) where++import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as BL+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Encoding.Error as T++encodeUtf8 :: String -> B.ByteString+encodeUtf8 = T.encodeUtf8 . T.pack++decodeUtf8 :: B.ByteString -> String+decodeUtf8 = T.unpack . T.decodeUtf8With skipChar++skipChar :: T.OnDecodeError+skipChar _ _ = Nothing++toLBS :: B.ByteString -> BL.ByteString+toLBS bs = BL.fromChunks [bs]++fromLBS :: BL.ByteString -> B.ByteString+fromLBS = B.concat . BL.toChunks
src/Data/MessagePack/Object.hs view
@@ -32,12 +32,17 @@ import Control.Monad.Trans.Error () import qualified Data.Attoparsec as A import qualified Data.ByteString as B-import qualified Data.ByteString.Char8 as C8+import qualified Data.ByteString.Lazy as BL+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Encoding as TL import Data.Typeable import Data.MessagePack.Assoc import Data.MessagePack.Pack import Data.MessagePack.Unpack+import Data.MessagePack.Internal.Utf8 -- | Object Representation of MessagePack data. data Object@@ -149,14 +154,29 @@ tryFromObject (ObjectFloat f) = Right f tryFromObject _ = tryFromObjectError +instance OBJECT String where+ toObject = toObject . encodeUtf8+ tryFromObject obj = liftM decodeUtf8 $ tryFromObject obj+ instance OBJECT B.ByteString where toObject = ObjectRAW tryFromObject (ObjectRAW bs) = Right bs tryFromObject _ = tryFromObjectError -instance OBJECT String where- toObject = toObject . C8.pack- tryFromObject obj = liftM C8.unpack $ tryFromObject obj+instance OBJECT BL.ByteString where+ toObject = ObjectRAW . fromLBS+ tryFromObject (ObjectRAW bs) = Right $ toLBS bs+ tryFromObject _ = tryFromObjectError++instance OBJECT T.Text where+ toObject = ObjectRAW . T.encodeUtf8+ tryFromObject (ObjectRAW bs) = Right $ T.decodeUtf8With skipChar bs+ tryFromObject _ = tryFromObjectError++instance OBJECT TL.Text where+ toObject = ObjectRAW . fromLBS . TL.encodeUtf8+ tryFromObject (ObjectRAW bs) = Right $ TL.decodeUtf8With skipChar $ toLBS bs+ tryFromObject _ = tryFromObjectError instance OBJECT a => OBJECT [a] where toObject = ObjectArray . map toObject
src/Data/MessagePack/Pack.hs view
@@ -27,11 +27,15 @@ import Data.Binary.IEEE754 import Data.Bits import qualified Data.ByteString as B-import qualified Data.ByteString.Char8 as B8-import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString.Lazy as BL+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Encoding as TL import qualified Data.Vector as V import Data.MessagePack.Assoc+import Data.MessagePack.Internal.Utf8 -- | Serializable class class Packable a where@@ -39,7 +43,7 @@ put :: a -> Put -- | Pack Haskell data to MessagePack string.-pack :: Packable a => a -> L.ByteString+pack :: Packable a => a -> BL.ByteString pack = runPut . put instance Packable Int where@@ -93,17 +97,24 @@ putFloat64be d instance Packable String where- put = putString length (putByteString . B8.pack)+ put = putString encodeUtf8 B.length putByteString instance Packable B.ByteString where- put = putString B.length putByteString+ put = putString id B.length putByteString -instance Packable L.ByteString where- put = putString (fromIntegral . L.length) putLazyByteString+instance Packable BL.ByteString where+ put = putString id (fromIntegral . BL.length) putLazyByteString -putString :: (s -> Int) -> (s -> Put) -> s -> Put-putString lf pf str = do- case lf str of+instance Packable T.Text where+ put = putString T.encodeUtf8 B.length putByteString++instance Packable TL.Text where+ put = putString TL.encodeUtf8 (fromIntegral . BL.length) putLazyByteString++putString :: (s -> t) -> (t -> Int) -> (t -> Put) -> s -> Put+putString cnv lf pf str = do+ let bs = cnv str+ case lf bs of len | len <= 31 -> do putWord8 $ 0xA0 .|. fromIntegral len len | len < 0x10000 -> do@@ -112,7 +123,7 @@ len -> do putWord8 0xDB putWord32be $ fromIntegral len- pf str+ pf bs instance Packable a => Packable [a] where put = putArray length (mapM_ put)
src/Data/MessagePack/Unpack.hs view
@@ -36,8 +36,11 @@ import Data.Binary.IEEE754 import Data.Bits import qualified Data.ByteString as B-import qualified Data.ByteString.Char8 as B8-import qualified Data.ByteString.Lazy as L+import qualified Data.ByteString.Lazy as BL+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Encoding as TL import Data.Int import Data.Typeable import qualified Data.Vector as V@@ -45,6 +48,7 @@ import Text.Printf import Data.MessagePack.Assoc+import Data.MessagePack.Internal.Utf8 -- | Deserializable class class Unpackable a where@@ -57,8 +61,8 @@ instance IsByteString B.ByteString where toBS = id -instance IsByteString L.ByteString where- toBS = B.concat . L.toChunks+instance IsByteString BL.ByteString where+ toBS = B.concat . BL.toChunks -- | The exception of unpack data UnpackError =@@ -153,14 +157,20 @@ fail $ printf "invlid double tag: 0x%02X" c instance Unpackable String where- get = parseString (\n -> return . B8.unpack =<< A.take n)+ get = parseString (\n -> return . decodeUtf8 =<< A.take n) instance Unpackable B.ByteString where get = parseString A.take -instance Unpackable L.ByteString where- get = parseString (\n -> do bs <- A.take n; return $ L.fromChunks [bs])+instance Unpackable BL.ByteString where+ get = parseString (\n -> return . toLBS =<< A.take n) +instance Unpackable T.Text where+ get = parseString (\n -> return . T.decodeUtf8With skipChar =<< A.take n)++instance Unpackable TL.Text where+ get = parseString (\n -> return . TL.decodeUtf8With skipChar . toLBS =<< A.take n)+ parseString :: (Int -> A.Parser a) -> A.Parser a parseString aget = do c <- A.anyWord8@@ -311,6 +321,3 @@ parseInt64 :: A.Parser Int64 parseInt64 = return . fromIntegral =<< parseUint64--toLBS :: B.ByteString -> L.ByteString-toLBS bs = L.fromChunks [bs]