-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | MessagePack -- -- MessagePack binary serialization format. @package Z-MessagePack @version 0.4.0.1 module Z.Data.MessagePack.Value -- | Representation of MessagePack data. data Value -- | true or false Bool :: !Bool -> Value -- | an integer Int :: {-# UNPACK #-} !Int64 -> Value -- | a floating point number Float :: {-# UNPACK #-} !Float -> Value -- | a floating point number Double :: {-# UNPACK #-} !Double -> Value -- | a UTF-8 string Str :: {-# UNPACK #-} !Text -> Value -- | a byte array Bin :: {-# UNPACK #-} !Bytes -> Value -- | a sequence of objects Array :: {-# UNPACK #-} !Vector Value -> Value -- | key-value pairs of objects Map :: {-# UNPACK #-} !Vector (Value, Value) -> Value Ext :: {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Bytes -> Value -- | nil Nil :: Value -- | Parse Value without consuming trailing bytes. parseValue :: Bytes -> (Bytes, Either ParseError Value) -- | Parse Value, if there're bytes left, parsing will fail. parseValue' :: Bytes -> Either ParseError Value -- | Increamental parse Value without consuming trailing bytes. parseValueChunks :: Monad m => m Bytes -> Bytes -> m (Bytes, Either ParseError Value) -- | Increamental parse Value, if there're bytes left, parsing will -- fail. parseValueChunks' :: Monad m => m Bytes -> Bytes -> m (Either ParseError Value) value :: Parser Value instance Z.Data.Text.Print.Print Z.Data.MessagePack.Value.Value instance GHC.Generics.Generic Z.Data.MessagePack.Value.Value instance GHC.Classes.Ord Z.Data.MessagePack.Value.Value instance GHC.Classes.Eq Z.Data.MessagePack.Value.Value instance GHC.Show.Show Z.Data.MessagePack.Value.Value instance Control.DeepSeq.NFData Z.Data.MessagePack.Value.Value instance Test.QuickCheck.Arbitrary.Arbitrary Z.Data.MessagePack.Value.Value -- | Builders to encode Haskell data types in MessagePack format. module Z.Data.MessagePack.Builder value :: Value -> Builder () nil :: Builder () bool :: Bool -> Builder () int :: Int64 -> Builder () float :: Float -> Builder () double :: Double -> Builder () -- | Construct a scientific value, see scientific. scientificValue :: Integer -> Int64 -> Value -- | Write a scientific value in ext 0x00(positive) and 0x01(negative) -- format, e.g. -- -- TODO: table -- -- TODO: table scientific :: Integer -> Int64 -> Builder () -- | Construct a timestamp(seconds, nanoseconds) value. timestampValue :: Int64 -> Int32 -> Value -- | Write a timestamp(seconds, nanoseconds) in ext 0xFF format, e.g. timestamp :: Int64 -> Int32 -> Builder () str' :: String -> Builder () str :: Text -> Builder () bin :: Bytes -> Builder () array :: Vec v a => (a -> Builder ()) -> v a -> Builder () array' :: (a -> Builder ()) -> [a] -> Builder () arrayHeader :: Int -> Builder () map :: (a -> Builder ()) -> (b -> Builder ()) -> Vector (a, b) -> Builder () map' :: (a -> Builder ()) -> (b -> Builder ()) -> [(a, b)] -> Builder () mapHeader :: Int -> Builder () ext :: Word8 -> Bytes -> Builder () -- | This module provides various tools to help user define -- MessagePack instance, please import MessagePack to get -- more instances. module Z.Data.MessagePack.Base -- | Type class for encode & decode MessagePack. class MessagePack a fromValue :: MessagePack a => Value -> Converter a fromValue :: (MessagePack a, Generic a, GFromValue (Rep a)) => Value -> Converter a toValue :: MessagePack a => a -> Value toValue :: (MessagePack a, Generic a, GToValue (Rep a)) => a -> Value encodeMessagePack :: MessagePack a => a -> Builder () encodeMessagePack :: (MessagePack a, Generic a, GEncodeMessagePack (Rep a)) => a -> Builder () -- | Representation of MessagePack data. data Value -- | true or false Bool :: !Bool -> Value -- | an integer Int :: {-# UNPACK #-} !Int64 -> Value -- | a floating point number Float :: {-# UNPACK #-} !Float -> Value -- | a floating point number Double :: {-# UNPACK #-} !Double -> Value -- | a UTF-8 string Str :: {-# UNPACK #-} !Text -> Value -- | a byte array Bin :: {-# UNPACK #-} !Bytes -> Value -- | a sequence of objects Array :: {-# UNPACK #-} !Vector Value -> Value -- | key-value pairs of objects Map :: {-# UNPACK #-} !Vector (Value, Value) -> Value Ext :: {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Bytes -> Value -- | nil Nil :: Value -- |
-- Settings T.pack T.pack False --defaultSettings :: Settings -- | Generic encode/decode Settings data Settings Settings :: (String -> Text) -> (String -> Text) -> Bool -> Settings -- | format field labels [fieldFmt] :: Settings -> String -> Text -- | format constructor names [constrFmt] :: Settings -> String -> Text -- | take missing field as Nil? [missingKeyAsNil] :: Settings -> Bool -- | Decode a MessagePack bytes, return any trailing bytes. decode :: MessagePack a => Bytes -> (Bytes, Either DecodeError a) -- | Decode a MessagePack doc, trailing bytes are not allowed. decode' :: MessagePack a => Bytes -> Either DecodeError a -- | Decode MessagePack doc chunks, return trailing bytes. decodeChunks :: (MessagePack a, Monad m) => m Bytes -> Bytes -> m (Bytes, Either DecodeError a) -- | Directly encode data to MessagePack bytes. encode :: MessagePack a => a -> Bytes -- | Encode data to MessagePack bytes chunks. encodeChunks :: MessagePack a => a -> [Bytes] type DecodeError = Either ParseError ConvertError -- | Type alias for error message type ParseError = [Text] -- | Type alias for a streaming parser, draw chunk from Monad m (with a -- initial chunk), return result in Either err x. type ParseChunks (m :: Type -> Type) chunk err x = m chunk -> chunk -> m (chunk, Either err x) -- | Parse Value without consuming trailing bytes. parseValue :: Bytes -> (Bytes, Either ParseError Value) -- | Parse Value, if there're bytes left, parsing will fail. parseValue' :: Bytes -> Either ParseError Value -- | Increamental parse Value without consuming trailing bytes. parseValueChunks :: Monad m => m Bytes -> Bytes -> m (Bytes, Either ParseError Value) -- | Increamental parse Value, if there're bytes left, parsing will -- fail. parseValueChunks' :: Monad m => m Bytes -> Bytes -> m (Either ParseError Value) gToValue :: GToValue f => Settings -> f a -> Value gFromValue :: GFromValue f => Settings -> Value -> Converter (f a) gEncodeMessagePack :: GEncodeMessagePack f => Settings -> f a -> Builder () -- | Run a Converter with input value. convertValue :: MessagePack a => Value -> Either ConvertError a -- | Converter provides a monadic interface to convert protocol IR -- (e.g.Value) to Haskell ADT. newtype Converter a Converter :: (forall r. () => ([PathElement] -> Text -> r) -> (a -> r) -> r) -> Converter a [runConverter] :: Converter a -> forall r. () => ([PathElement] -> Text -> r) -> (a -> r) -> r -- | Text version of fail. fail' :: Text -> Converter a -- | Add (JSON) Path context to a converter -- -- When converting a complex structure, it helps to annotate -- (sub)converters with context, so that if an error occurs, you can find -- its location. -- --
-- withFlatMapR "Person" $ \o -> -- Person -- <$> o .: "name" <?> Key "name" -- <*> o .: "age" <?> Key "age" ---- -- (Standard methods like (.:) already do this.) -- -- With such annotations, if an error occurs, you will get a (JSON) Path -- location of that error. (>) :: Converter a -> PathElement -> Converter a infixl 9 > -- | Add context to a failure message, indicating the name of the structure -- being converted. -- --
-- prependContext "MyType" (fail "[error message]") -- -- Error: "converting MyType failed, [error message]" --prependContext :: Text -> Converter a -> Converter a -- | Elements of a (JSON) Value path used to describe the location of an -- error. data PathElement -- | Path element of a key into an object, "object.key". Key :: {-# UNPACK #-} !Text -> PathElement -- | Path element of an index into an array, "array[index]". Index :: {-# UNPACK #-} !Int -> PathElement -- | path of a embedded (JSON) String Embedded :: PathElement -- | Error info with (JSON) Path info. data ConvertError ConvertError :: [PathElement] -> Text -> ConvertError [errPath] :: ConvertError -> [PathElement] [errMsg] :: ConvertError -> Text -- | Produce an error message like converting XXX failed, expected XXX, -- encountered XXX. typeMismatch :: Text -> Text -> Value -> Converter a fromNil :: Text -> a -> Value -> Converter a withBool :: Text -> (Bool -> Converter a) -> Value -> Converter a withStr :: Text -> (Text -> Converter a) -> Value -> Converter a withBin :: Text -> (Bytes -> Converter a) -> Value -> Converter a withArray :: Text -> (Vector Value -> Converter a) -> Value -> Converter a -- | Directly use Map as key-values for further converting. withKeyValues :: Text -> (Vector (Value, Value) -> Converter a) -> Value -> Converter a -- | Take a Map as an 'FM.FlatMap Value Value', on key duplication -- prefer first one. withFlatMap :: Text -> (FlatMap Value Value -> Converter a) -> Value -> Converter a -- | Take a Map as an 'FM.FlatMap Value Value', on key duplication -- prefer last one. withFlatMapR :: Text -> (FlatMap Value Value -> Converter a) -> Value -> Converter a -- | withBoundedScientific name f value applies f -- to the Scientific number when value is a Ext -- 0x00/0x01 with exponent less than or equal to 1024. withBoundedScientific :: Text -> (Scientific -> Converter a) -> Value -> Converter a withSystemTime :: Text -> (SystemTime -> Converter a) -> Value -> Converter a -- | Retrieve the value associated with the given key of an Map. The -- result is empty if the key is not present or the value cannot -- be converted to the desired type. -- -- This accessor is appropriate if the key and value must be -- present in an object for it to be valid. If the key and value are -- optional, use .:? instead. (.:) :: MessagePack a => FlatMap Value Value -> Text -> Converter a -- | Retrieve the value associated with the given key of an Map. The -- result is Nothing if the key is not present or if its value is -- Nil, or fail if the value cannot be converted to the desired -- type. -- -- This accessor is most useful if the key and value can be absent from -- an object without affecting its validity. If the key and value are -- mandatory, use .: instead. (.:?) :: MessagePack a => FlatMap Value Value -> Text -> Converter (Maybe a) -- | Retrieve the value associated with the given key of an Map. The -- result is Nothing if the key is not present or fail if the -- value cannot be converted to the desired type. -- -- This differs from .:? by attempting to convert Nil the -- same as any other MessagePack value, instead of interpreting it as -- Nothing. (.:!) :: MessagePack a => FlatMap Value Value -> Text -> Converter (Maybe a) convertField :: (Value -> Converter a) -> FlatMap Value Value -> Text -> Converter a -- | Variant of .:? with explicit converter function. convertFieldMaybe :: (Value -> Converter a) -> FlatMap Value Value -> Text -> Converter (Maybe a) -- | Variant of .:! with explicit converter function. convertFieldMaybe' :: (Value -> Converter a) -> FlatMap Value Value -> Text -> Converter (Maybe a) -- | Connect key and value to a tuple to be used with object. (.=) :: MessagePack v => Text -> v -> (Value, Value) infixr 8 .= -- | Alias for Map . pack. object :: [(Value, Value)] -> Value -- | Connect key and value to a KVItem using colon, key will -- be escaped. (.!) :: MessagePack v => Text -> v -> KVItem infixr 8 .! -- | Write map header and KVItems. object' :: KVItem -> Builder () -- | A newtype for Builder, whose semigroup's instance is to connect -- kv builder and sum kv length. data KVItem instance Z.Data.MessagePack.Base.GConstrFromValue GHC.Generics.V1 instance forall k (f :: k -> *) (g :: k -> *). (Z.Data.MessagePack.Base.GConstrFromValue f, Z.Data.MessagePack.Base.GConstrFromValue g) => Z.Data.MessagePack.Base.GConstrFromValue (f GHC.Generics.:+: g) instance GHC.Generics.Constructor c => Z.Data.MessagePack.Base.GConstrFromValue (GHC.Generics.C1 c GHC.Generics.U1) instance forall k (c :: GHC.Generics.Meta) (sc :: GHC.Generics.Meta) (f :: k -> *). (GHC.Generics.Constructor c, Z.Data.MessagePack.Base.GFromValue (GHC.Generics.S1 sc f)) => Z.Data.MessagePack.Base.GConstrFromValue (GHC.Generics.C1 c (GHC.Generics.S1 sc f)) instance (Z.Data.Generics.Utils.ProductSize (a GHC.Generics.:*: b), Z.Data.MessagePack.Base.GFromFields (a GHC.Generics.:*: b), Z.Data.MessagePack.Base.GBuildLookup (a GHC.Generics.:*: b), GHC.Generics.Constructor c) => Z.Data.MessagePack.Base.GConstrFromValue (GHC.Generics.C1 c (a GHC.Generics.:*: b)) instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Z.Data.MessagePack.Base.GConstrFromValue f => Z.Data.MessagePack.Base.GFromValue (GHC.Generics.D1 c f) instance forall k (a :: k -> *) (b :: k -> *). (Z.Data.MessagePack.Base.GBuildLookup a, Z.Data.MessagePack.Base.GBuildLookup b) => Z.Data.MessagePack.Base.GBuildLookup (a GHC.Generics.:*: b) instance forall k (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness) (f :: k -> *). Z.Data.MessagePack.Base.GBuildLookup (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance forall k (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness) (f :: k -> *). Z.Data.MessagePack.Base.GBuildLookup (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance (Z.Data.Generics.Utils.ProductSize a, Z.Data.MessagePack.Base.GFromFields a, Z.Data.MessagePack.Base.GFromFields b, Z.Data.MessagePack.Base.LookupTable a GHC.Types.~ Z.Data.MessagePack.Base.LookupTable b) => Z.Data.MessagePack.Base.GFromFields (a GHC.Generics.:*: b) instance forall k (f :: k -> *) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). Z.Data.MessagePack.Base.GFromValue f => Z.Data.MessagePack.Base.GFromFields (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance forall k (f :: k -> *) (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). (Z.Data.MessagePack.Base.GFromValue f, GHC.Generics.Selector ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds)) => Z.Data.MessagePack.Base.GFromFields (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.GToValue (GHC.Generics.K1 i a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.GEncodeMessagePack (GHC.Generics.K1 i a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.GFromValue (GHC.Generics.K1 i a) instance forall k (a :: k). Z.Data.MessagePack.Base.MessagePack (Data.Proxy.Proxy a) instance Z.Data.MessagePack.Base.MessagePack Z.Data.MessagePack.Value.Value instance Z.Data.MessagePack.Base.MessagePack Z.Data.Text.Base.Text instance Z.Data.MessagePack.Base.MessagePack Data.Scientific.Scientific instance (GHC.Classes.Ord a, Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b) => Z.Data.MessagePack.Base.MessagePack (Z.Data.Vector.FlatMap.FlatMap a b) instance (GHC.Classes.Ord a, Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Z.Data.Vector.FlatSet.FlatSet a) instance (GHC.Classes.Eq a, Data.Hashable.Class.Hashable a, Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b) => Z.Data.MessagePack.Base.MessagePack (Data.HashMap.Internal.HashMap a b) instance (GHC.Classes.Ord a, Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b) => Z.Data.MessagePack.Base.MessagePack (Data.Map.Internal.Map a b) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Z.Data.Vector.FlatIntMap.FlatIntMap a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.IntMap.Internal.IntMap a) instance Z.Data.MessagePack.Base.MessagePack Z.Data.Vector.FlatIntSet.FlatIntSet instance Z.Data.MessagePack.Base.MessagePack Data.IntSet.Internal.IntSet instance (GHC.Classes.Ord a, Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Data.Set.Internal.Set a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Sequence.Internal.Seq a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Tree.Tree a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Primitive.Array.Array a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Primitive.SmallArray.SmallArray a) instance (Data.Primitive.Types.Prim a, Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Data.Primitive.PrimArray.PrimArray a) instance (Z.Data.Array.UnliftedArray.PrimUnlifted a, Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Z.Data.Array.UnliftedArray.UnliftedArray a) instance Z.Data.MessagePack.Base.MessagePack Data.Primitive.ByteArray.ByteArray instance (Data.Primitive.Types.Prim a, Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Z.Data.Vector.Base.PrimVector a) instance Z.Data.MessagePack.Base.MessagePack Z.Data.Vector.Base.Bytes instance Z.Data.MessagePack.Base.MessagePack Z.Data.CBytes.CBytes instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Z.Data.Vector.Base.Vector a) instance (GHC.Classes.Eq a, Data.Hashable.Class.Hashable a, Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Data.HashSet.Internal.HashSet a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack [a] instance Z.Data.MessagePack.Base.MessagePack GHC.Base.String instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (GHC.Base.NonEmpty a) instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Bool instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Char instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Double instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Float instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Int instance Z.Data.MessagePack.Base.MessagePack GHC.Int.Int8 instance Z.Data.MessagePack.Base.MessagePack GHC.Int.Int16 instance Z.Data.MessagePack.Base.MessagePack GHC.Int.Int32 instance Z.Data.MessagePack.Base.MessagePack GHC.Int.Int64 instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Word instance Z.Data.MessagePack.Base.MessagePack GHC.Word.Word8 instance Z.Data.MessagePack.Base.MessagePack GHC.Word.Word16 instance Z.Data.MessagePack.Base.MessagePack GHC.Word.Word32 instance Z.Data.MessagePack.Base.MessagePack GHC.Word.Word64 instance Z.Data.MessagePack.Base.MessagePack GHC.Integer.Type.Integer instance Z.Data.MessagePack.Base.MessagePack GHC.Natural.Natural instance Z.Data.MessagePack.Base.MessagePack GHC.Types.Ordering instance Z.Data.MessagePack.Base.MessagePack () instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (GHC.Maybe.Maybe a) instance (Z.Data.MessagePack.Base.MessagePack a, GHC.Real.Integral a) => Z.Data.MessagePack.Base.MessagePack (GHC.Real.Ratio a) instance forall k (a :: k). Data.Fixed.HasResolution a => Z.Data.MessagePack.Base.MessagePack (Data.Fixed.Fixed a) instance forall k (f :: k -> *) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). Z.Data.MessagePack.Base.GFromValue f => Z.Data.MessagePack.Base.GFromValue (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance forall k (f :: k -> *) (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). (Z.Data.MessagePack.Base.GFromValue f, GHC.Generics.Selector ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds)) => Z.Data.MessagePack.Base.GFromValue (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance Z.Data.MessagePack.Base.GConstrEncodeMessagePack GHC.Generics.V1 instance forall k (f :: k -> *) (g :: k -> *). (Z.Data.MessagePack.Base.GConstrEncodeMessagePack f, Z.Data.MessagePack.Base.GConstrEncodeMessagePack g) => Z.Data.MessagePack.Base.GConstrEncodeMessagePack (f GHC.Generics.:+: g) instance GHC.Generics.Constructor c => Z.Data.MessagePack.Base.GConstrEncodeMessagePack (GHC.Generics.C1 c GHC.Generics.U1) instance forall k (c :: GHC.Generics.Meta) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness) (f :: k -> *). (GHC.Generics.Constructor c, Z.Data.MessagePack.Base.GEncodeMessagePack (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f)) => Z.Data.MessagePack.Base.GConstrEncodeMessagePack (GHC.Generics.C1 c (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f)) instance forall k (c :: GHC.Generics.Meta) (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness) (f :: k -> *). (GHC.Generics.Constructor c, Z.Data.MessagePack.Base.GEncodeMessagePack (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f)) => Z.Data.MessagePack.Base.GConstrEncodeMessagePack (GHC.Generics.C1 c (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f)) instance (Z.Data.MessagePack.Base.GEncodeMessagePack (a GHC.Generics.:*: b), Z.Data.MessagePack.Base.GAddProductSize (a GHC.Generics.:*: b), Z.Data.Generics.Utils.ProductSize (a GHC.Generics.:*: b), GHC.Generics.Constructor c) => Z.Data.MessagePack.Base.GConstrEncodeMessagePack (GHC.Generics.C1 c (a GHC.Generics.:*: b)) instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Z.Data.MessagePack.Base.GConstrEncodeMessagePack f => Z.Data.MessagePack.Base.GEncodeMessagePack (GHC.Generics.D1 c f) instance Z.Data.MessagePack.Base.GAddProductSize a => Z.Data.MessagePack.Base.GAddProductSize (a GHC.Generics.:*: b) instance Z.Data.MessagePack.Base.GAddProductSize (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance Z.Data.MessagePack.Base.GAddProductSize (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance forall k (f :: k -> *) (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). (Z.Data.MessagePack.Base.GEncodeMessagePack f, GHC.Generics.Selector ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds)) => Z.Data.MessagePack.Base.GEncodeMessagePack (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance forall k (f :: k -> *) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). Z.Data.MessagePack.Base.GEncodeMessagePack f => Z.Data.MessagePack.Base.GEncodeMessagePack (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance forall k (a :: k -> *) (b :: k -> *). (Z.Data.MessagePack.Base.GEncodeMessagePack a, Z.Data.MessagePack.Base.GEncodeMessagePack b) => Z.Data.MessagePack.Base.GEncodeMessagePack (a GHC.Generics.:*: b) instance Z.Data.MessagePack.Base.GConstrToValue GHC.Generics.V1 instance forall k (f :: k -> *) (g :: k -> *). (Z.Data.MessagePack.Base.GConstrToValue f, Z.Data.MessagePack.Base.GConstrToValue g) => Z.Data.MessagePack.Base.GConstrToValue (f GHC.Generics.:+: g) instance GHC.Generics.Constructor c => Z.Data.MessagePack.Base.GConstrToValue (GHC.Generics.C1 c GHC.Generics.U1) instance forall k (c :: GHC.Generics.Meta) (sc :: GHC.Generics.Meta) (f :: k -> *). (GHC.Generics.Constructor c, Z.Data.MessagePack.Base.GToValue (GHC.Generics.S1 sc f)) => Z.Data.MessagePack.Base.GConstrToValue (GHC.Generics.C1 c (GHC.Generics.S1 sc f)) instance (Z.Data.Generics.Utils.ProductSize (a GHC.Generics.:*: b), Z.Data.MessagePack.Base.GWriteFields (a GHC.Generics.:*: b), Z.Data.MessagePack.Base.GMergeFields (a GHC.Generics.:*: b), GHC.Generics.Constructor c) => Z.Data.MessagePack.Base.GConstrToValue (GHC.Generics.C1 c (a GHC.Generics.:*: b)) instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Z.Data.MessagePack.Base.GConstrToValue f => Z.Data.MessagePack.Base.GToValue (GHC.Generics.D1 c f) instance forall k (a :: k -> *) (b :: k -> *). Z.Data.MessagePack.Base.GMergeFields a => Z.Data.MessagePack.Base.GMergeFields (a GHC.Generics.:*: b) instance forall k (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness) (f :: k -> *). Z.Data.MessagePack.Base.GMergeFields (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance forall k (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness) (f :: k -> *). Z.Data.MessagePack.Base.GMergeFields (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance (Z.Data.Generics.Utils.ProductSize a, Z.Data.MessagePack.Base.GWriteFields a, Z.Data.MessagePack.Base.GWriteFields b, Z.Data.MessagePack.Base.Field a GHC.Types.~ Z.Data.MessagePack.Base.Field b) => Z.Data.MessagePack.Base.GWriteFields (a GHC.Generics.:*: b) instance forall k (f :: k -> *) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). Z.Data.MessagePack.Base.GToValue f => Z.Data.MessagePack.Base.GWriteFields (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance forall k (f :: k -> *) (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). (Z.Data.MessagePack.Base.GToValue f, GHC.Generics.Selector ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds)) => Z.Data.MessagePack.Base.GWriteFields (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance forall k (f :: k -> *) (l :: GHC.Types.Symbol) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). (Z.Data.MessagePack.Base.GToValue f, GHC.Generics.Selector ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds)) => Z.Data.MessagePack.Base.GToValue (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Maybe.Just l) u ss ds) f) instance forall k (f :: k -> *) (u :: GHC.Generics.SourceUnpackedness) (ss :: GHC.Generics.SourceStrictness) (ds :: GHC.Generics.DecidedStrictness). Z.Data.MessagePack.Base.GToValue f => Z.Data.MessagePack.Base.GToValue (GHC.Generics.S1 ('GHC.Generics.MetaSel 'GHC.Maybe.Nothing u ss ds) f) instance GHC.Base.Semigroup Z.Data.MessagePack.Base.KVItem -- | This module provides an interface similar to Z.Data.JSON, to -- work with MessagePack binary format. -- --
-- import GHC.Generics (Generic)
-- import qualified Z.Data.MessagePack as MessagePack
-- import qualified Z.Data.Text as T
--
-- data Person = Person {name :: T.Text, age :: Int}
-- deriving (Show, Generic)
-- deriving anyclass (MessagePack.MessagePack)
--
-- > MessagePack.encode Person{ name="Alice", age=16 }
-- > [130,164,110,97,109,101,165,65,108,105,99,101,163,97,103,101,16]
--
--
-- MessagePack is a schemaless format, which means the encoded data can
-- be recovered into some form(Value in haskell case) without
-- providing data definition, e.g. the data encoded above:
--
-- -- [130, 164, 110, 97, 109, 101, 165, 65, 108, 105, 99, 101, 163, 97, 103, 101, 16] -- 0x82 0xA4 'n' 'a' 'm' 'e' 0xA5 'A' 'l' 'i' 'c' 'e' 0xA3 'a' 'g' 'e' int -- map str str str 16 -- 2kvs 4bytes 5bytes 3bytes ---- -- This property makes it suitable for passing data across language -- boundary, e.g. from a static typed language to a dynamic one, at the -- cost of a lower space efficiency(i.e. type tag and field label). module Z.Data.MessagePack -- | Type class for encode & decode MessagePack. class MessagePack a fromValue :: MessagePack a => Value -> Converter a fromValue :: (MessagePack a, Generic a, GFromValue (Rep a)) => Value -> Converter a toValue :: MessagePack a => a -> Value toValue :: (MessagePack a, Generic a, GToValue (Rep a)) => a -> Value encodeMessagePack :: MessagePack a => a -> Builder () encodeMessagePack :: (MessagePack a, Generic a, GEncodeMessagePack (Rep a)) => a -> Builder () -- | Representation of MessagePack data. data Value -- | true or false Bool :: !Bool -> Value -- | an integer Int :: {-# UNPACK #-} !Int64 -> Value -- | a floating point number Float :: {-# UNPACK #-} !Float -> Value -- | a floating point number Double :: {-# UNPACK #-} !Double -> Value -- | a UTF-8 string Str :: {-# UNPACK #-} !Text -> Value -- | a byte array Bin :: {-# UNPACK #-} !Bytes -> Value -- | a sequence of objects Array :: {-# UNPACK #-} !Vector Value -> Value -- | key-value pairs of objects Map :: {-# UNPACK #-} !Vector (Value, Value) -> Value Ext :: {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Bytes -> Value -- | nil Nil :: Value -- |
-- Settings T.pack T.pack False --defaultSettings :: Settings -- | Generic encode/decode Settings data Settings Settings :: (String -> Text) -> (String -> Text) -> Bool -> Settings -- | format field labels [fieldFmt] :: Settings -> String -> Text -- | format constructor names [constrFmt] :: Settings -> String -> Text -- | take missing field as Nil? [missingKeyAsNil] :: Settings -> Bool -- | Snake casing a pascal cased constructor name or camel cased field -- name, words are always lower cased and separated by an underscore. snakeCase :: String -> Text -- | Train casing a pascal cased constructor name or camel cased field -- name, words are always lower cased and separated by a hyphen. trainCase :: String -> Text -- | Decode a MessagePack instance from file. readMessagePackFile :: (HasCallStack, MessagePack a) => CBytes -> IO a -- | Encode a MessagePack instance to file. writeMessagePackFile :: (HasCallStack, MessagePack a) => CBytes -> a -> IO () -- | Decode a MessagePack bytes, return any trailing bytes. decode :: MessagePack a => Bytes -> (Bytes, Either DecodeError a) -- | Decode a MessagePack doc, trailing bytes are not allowed. decode' :: MessagePack a => Bytes -> Either DecodeError a -- | Decode MessagePack doc chunks, return trailing bytes. decodeChunks :: (MessagePack a, Monad m) => m Bytes -> Bytes -> m (Bytes, Either DecodeError a) -- | Directly encode data to MessagePack bytes. encode :: MessagePack a => a -> Bytes -- | Encode data to MessagePack bytes chunks. encodeChunks :: MessagePack a => a -> [Bytes] type DecodeError = Either ParseError ConvertError -- | Type alias for error message type ParseError = [Text] -- | Parse Value without consuming trailing bytes. parseValue :: Bytes -> (Bytes, Either ParseError Value) -- | Parse Value, if there're bytes left, parsing will fail. parseValue' :: Bytes -> Either ParseError Value -- | Increamental parse Value without consuming trailing bytes. parseValueChunks :: Monad m => m Bytes -> Bytes -> m (Bytes, Either ParseError Value) -- | Increamental parse Value, if there're bytes left, parsing will -- fail. parseValueChunks' :: Monad m => m Bytes -> Bytes -> m (Either ParseError Value) gToValue :: GToValue f => Settings -> f a -> Value gFromValue :: GFromValue f => Settings -> Value -> Converter (f a) gEncodeMessagePack :: GEncodeMessagePack f => Settings -> f a -> Builder () -- | Run a Converter with input value. convertValue :: MessagePack a => Value -> Either ConvertError a -- | Converter provides a monadic interface to convert protocol IR -- (e.g.Value) to Haskell ADT. newtype Converter a Converter :: (forall r. () => ([PathElement] -> Text -> r) -> (a -> r) -> r) -> Converter a [runConverter] :: Converter a -> forall r. () => ([PathElement] -> Text -> r) -> (a -> r) -> r -- | Text version of fail. fail' :: Text -> Converter a -- | Add (JSON) Path context to a converter -- -- When converting a complex structure, it helps to annotate -- (sub)converters with context, so that if an error occurs, you can find -- its location. -- --
-- withFlatMapR "Person" $ \o -> -- Person -- <$> o .: "name" <?> Key "name" -- <*> o .: "age" <?> Key "age" ---- -- (Standard methods like (.:) already do this.) -- -- With such annotations, if an error occurs, you will get a (JSON) Path -- location of that error. (>) :: Converter a -> PathElement -> Converter a infixl 9 > -- | Add context to a failure message, indicating the name of the structure -- being converted. -- --
-- prependContext "MyType" (fail "[error message]") -- -- Error: "converting MyType failed, [error message]" --prependContext :: Text -> Converter a -> Converter a -- | Elements of a (JSON) Value path used to describe the location of an -- error. data PathElement -- | Path element of a key into an object, "object.key". Key :: {-# UNPACK #-} !Text -> PathElement -- | Path element of an index into an array, "array[index]". Index :: {-# UNPACK #-} !Int -> PathElement -- | path of a embedded (JSON) String Embedded :: PathElement -- | Error info with (JSON) Path info. data ConvertError ConvertError :: [PathElement] -> Text -> ConvertError [errPath] :: ConvertError -> [PathElement] [errMsg] :: ConvertError -> Text -- | Produce an error message like converting XXX failed, expected XXX, -- encountered XXX. typeMismatch :: Text -> Text -> Value -> Converter a fromNil :: Text -> a -> Value -> Converter a withBool :: Text -> (Bool -> Converter a) -> Value -> Converter a withStr :: Text -> (Text -> Converter a) -> Value -> Converter a withBin :: Text -> (Bytes -> Converter a) -> Value -> Converter a withArray :: Text -> (Vector Value -> Converter a) -> Value -> Converter a -- | Directly use Map as key-values for further converting. withKeyValues :: Text -> (Vector (Value, Value) -> Converter a) -> Value -> Converter a -- | Take a Map as an 'FM.FlatMap Value Value', on key duplication -- prefer first one. withFlatMap :: Text -> (FlatMap Value Value -> Converter a) -> Value -> Converter a -- | Take a Map as an 'FM.FlatMap Value Value', on key duplication -- prefer last one. withFlatMapR :: Text -> (FlatMap Value Value -> Converter a) -> Value -> Converter a -- | Retrieve the value associated with the given key of an Map. The -- result is empty if the key is not present or the value cannot -- be converted to the desired type. -- -- This accessor is appropriate if the key and value must be -- present in an object for it to be valid. If the key and value are -- optional, use .:? instead. (.:) :: MessagePack a => FlatMap Value Value -> Text -> Converter a -- | Retrieve the value associated with the given key of an Map. The -- result is Nothing if the key is not present or if its value is -- Nil, or fail if the value cannot be converted to the desired -- type. -- -- This accessor is most useful if the key and value can be absent from -- an object without affecting its validity. If the key and value are -- mandatory, use .: instead. (.:?) :: MessagePack a => FlatMap Value Value -> Text -> Converter (Maybe a) -- | Retrieve the value associated with the given key of an Map. The -- result is Nothing if the key is not present or fail if the -- value cannot be converted to the desired type. -- -- This differs from .:? by attempting to convert Nil the -- same as any other MessagePack value, instead of interpreting it as -- Nothing. (.:!) :: MessagePack a => FlatMap Value Value -> Text -> Converter (Maybe a) convertField :: (Value -> Converter a) -> FlatMap Value Value -> Text -> Converter a -- | Variant of .:? with explicit converter function. convertFieldMaybe :: (Value -> Converter a) -> FlatMap Value Value -> Text -> Converter (Maybe a) -- | Variant of .:! with explicit converter function. convertFieldMaybe' :: (Value -> Converter a) -> FlatMap Value Value -> Text -> Converter (Maybe a) -- | Connect key and value to a tuple to be used with object. (.=) :: MessagePack v => Text -> v -> (Value, Value) infixr 8 .= -- | Alias for Map . pack. object :: [(Value, Value)] -> Value -- | Connect key and value to a KVItem using colon, key will -- be escaped. (.!) :: MessagePack v => Text -> v -> KVItem infixr 8 .! -- | Write map header and KVItems. object' :: KVItem -> Builder () -- | A newtype for Builder, whose semigroup's instance is to connect -- kv builder and sum kv length. data KVItem instance forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1). Z.Data.MessagePack.Base.MessagePack (f (g a)) => Z.Data.MessagePack.Base.MessagePack (Data.Functor.Compose.Compose f g a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Semigroup.Min a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Semigroup.Max a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Semigroup.First a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Semigroup.Last a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Semigroup.WrappedMonoid a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Semigroup.Internal.Dual a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Monoid.First a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Monoid.Last a) instance Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Functor.Identity.Identity a) instance forall k a (b :: k). Z.Data.MessagePack.Base.MessagePack a => Z.Data.MessagePack.Base.MessagePack (Data.Functor.Const.Const a b) instance forall k b (a :: k). Z.Data.MessagePack.Base.MessagePack b => Z.Data.MessagePack.Base.MessagePack (Data.Tagged.Tagged a b) instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CChar instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CSChar instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CUChar instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CShort instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CUShort instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CInt instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CUInt instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CLong instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CULong instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CPtrdiff instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CSize instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CWchar instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CSigAtomic instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CLLong instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CULLong instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CBool instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CIntPtr instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CUIntPtr instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CIntMax instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CUIntMax instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CClock instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CTime instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CUSeconds instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CSUSeconds instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CFloat instance Z.Data.MessagePack.Base.MessagePack Foreign.C.Types.CDouble instance (Z.Data.MessagePack.Base.MessagePack (f a), Z.Data.MessagePack.Base.MessagePack (g a), Z.Data.MessagePack.Base.MessagePack a) => Z.Data.MessagePack.Base.MessagePack (Data.Functor.Sum.Sum f g a) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b) => Z.Data.MessagePack.Base.MessagePack (Data.Either.Either a b) instance forall k (f :: k -> *) (a :: k) (g :: k -> *). (Z.Data.MessagePack.Base.MessagePack (f a), Z.Data.MessagePack.Base.MessagePack (g a)) => Z.Data.MessagePack.Base.MessagePack (Data.Functor.Product.Product f g a) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b) => Z.Data.MessagePack.Base.MessagePack (a, b) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b, Z.Data.MessagePack.Base.MessagePack c) => Z.Data.MessagePack.Base.MessagePack (a, b, c) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b, Z.Data.MessagePack.Base.MessagePack c, Z.Data.MessagePack.Base.MessagePack d) => Z.Data.MessagePack.Base.MessagePack (a, b, c, d) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b, Z.Data.MessagePack.Base.MessagePack c, Z.Data.MessagePack.Base.MessagePack d, Z.Data.MessagePack.Base.MessagePack e) => Z.Data.MessagePack.Base.MessagePack (a, b, c, d, e) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b, Z.Data.MessagePack.Base.MessagePack c, Z.Data.MessagePack.Base.MessagePack d, Z.Data.MessagePack.Base.MessagePack e, Z.Data.MessagePack.Base.MessagePack f) => Z.Data.MessagePack.Base.MessagePack (a, b, c, d, e, f) instance (Z.Data.MessagePack.Base.MessagePack a, Z.Data.MessagePack.Base.MessagePack b, Z.Data.MessagePack.Base.MessagePack c, Z.Data.MessagePack.Base.MessagePack d, Z.Data.MessagePack.Base.MessagePack e, Z.Data.MessagePack.Base.MessagePack f, Z.Data.MessagePack.Base.MessagePack g) => Z.Data.MessagePack.Base.MessagePack (a, b, c, d, e, f, g) instance Z.Data.MessagePack.Base.MessagePack GHC.IO.Exception.ExitCode instance Z.Data.MessagePack.Base.MessagePack Data.Version.Version instance Z.Data.MessagePack.Base.MessagePack Data.Time.Clock.Internal.UTCTime.UTCTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.Clock.Internal.SystemTime.SystemTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.LocalTime.Internal.ZonedTime.ZonedTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.Calendar.Days.Day instance Z.Data.MessagePack.Base.MessagePack Data.Time.LocalTime.Internal.LocalTime.LocalTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.LocalTime.Internal.TimeOfDay.TimeOfDay instance Z.Data.MessagePack.Base.MessagePack Data.Time.Clock.Internal.NominalDiffTime.NominalDiffTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.Clock.Internal.DiffTime.DiffTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.LocalTime.Internal.CalendarDiffTime.CalendarDiffTime instance Z.Data.MessagePack.Base.MessagePack Data.Time.Calendar.CalendarDiffDays.CalendarDiffDays instance Z.Data.MessagePack.Base.MessagePack Data.Time.Calendar.Week.DayOfWeek -- | This module provides MessagePack-RPC implementation. module Z.IO.RPC.MessagePack type ServerLoop = (UVStream -> IO ()) -> IO () type ServerService a = Text -> Maybe (ServerHandler a) data ServerHandler a [CallHandler] :: (MessagePack req, MessagePack res) => (SessionCtx a -> req -> IO res) -> ServerHandler a [NotifyHandler] :: MessagePack req => (SessionCtx a -> req -> IO ()) -> ServerHandler a [StreamHandler] :: (MessagePack req, MessagePack res) => (SessionCtx a -> req -> IO (Source res)) -> ServerHandler a data SessionCtx a readSessionCtx :: SessionCtx a -> IO (Maybe a) writeSessionCtx :: SessionCtx a -> a -> IO () clearSessionCtx :: SessionCtx a -> IO () -- | Try to modify SessionCtx if it has. -- -- Note that you can set the modifier function to return Nothing to clear -- SessionCtx. modifySessionCtx :: SessionCtx a -> (a -> Maybe a) -> IO () -- | Serve a RPC service. serveRPC :: ServerLoop -> ServerService a -> IO () -- | Serve a RPC service with more control. serveRPC' :: ServerLoop -> Int -> Int -> ServerService a -> IO () -- | Simple router using FlatMap, lookup name in O(log(N)). -- --
-- import Z.IO.PRC.MessagePack
-- import Z.IO.Network
-- import Z.IO
--
-- serveRPC (startTCPServer defaultTCPServerConfig) . simpleRouter $
-- [ ("foo", CallHandler $ \ ctx req -> do
-- ... )
-- , ("bar", CallHandler $ \ ctx req -> do
-- ... )
-- ]
--
simpleRouter :: [(Text, ServerHandler a)] -> ServerService a
data Client
Client :: Counter -> Counter -> BufferedInput -> BufferedOutput -> Client
[_clientSeqRef] :: Client -> Counter
[_clientPipelineReqNum] :: Client -> Counter
[_clientBufferedInput] :: Client -> BufferedInput
[_clientBufferedOutput] :: Client -> BufferedOutput
-- | Open a RPC client from input/output device.
rpcClient :: (Input dev, Output dev) => dev -> IO Client
-- | Open a RPC client with more control.
rpcClient' :: (Input i, Output o) => i -> o -> Int -> Int -> IO Client
-- | Send a single RPC call and get result.
call :: (MessagePack req, MessagePack res, HasCallStack) => Client -> Text -> req -> IO res
-- | Send a single notification RPC call without getting result.
notify :: (MessagePack req, HasCallStack) => Client -> Text -> req -> IO ()
type PipelineId = Int
type PipelineResult = FlatIntMap Value
-- | Make a call inside a pipeline, which will be sent in batch when
-- execPipeline.
--
-- -- ... -- fooId <- callPipeline client "foo" $ ... -- barId <- callPipeline client "bar" $ ... -- notifyPipeline client "qux" $ ... -- -- r <- execPipeline client -- -- fooResult <- fetchPipeline fooId r -- barResult <- fetchPipeline barId r --callPipeline :: HasCallStack => MessagePack req => Client -> Text -> req -> IO PipelineId -- | Make a notify inside a pipeline, which will be sent in batch when -- execPipeline. -- -- Notify calls doesn't affect execution's result. notifyPipeline :: HasCallStack => MessagePack req => Client -> Text -> req -> IO () -- | Sent request in batch and get result in a map identified by -- PipelineId. execPipeline :: HasCallStack => Client -> IO PipelineResult -- | Use the PipelineId returned when callPipeline to fetch -- call's result. fetchPipeline :: HasCallStack => MessagePack res => PipelineId -> PipelineResult -> IO res -- | Call a stream method, no other call or notify should be -- sent until returned stream is consumed completely. -- -- This is implemented by extend MessagePack-RPC protocol by adding -- following new message types: -- --
-- -- start stream request -- [typ 0x04, name, param] -- -- -- stop stream request -- [typ 0x05] -- -- -- each stream response -- [typ 0x06, err, value] -- -- -- stream response end -- [typ 0x07] ---- -- The return tuple is a pair of a stop action and a Source, to -- terminate stream early, call the stop action. Please continue -- consuming until EOF reached, otherwise the state of the Client -- will be incorrect. callStream :: (MessagePack req, MessagePack res, HasCallStack) => Client -> Text -> req -> IO (IO (), Source res) data Request a Notify :: (Text, a) -> Request a Call :: (Int64, Text, a) -> Request a StreamStart :: (Text, a) -> Request a -- | Exception thrown when remote endpoint return errors. data RPCException RPCStreamUnconsumed :: CallStack -> RPCException RPCException :: Value -> CallStack -> RPCException instance GHC.Show.Show Z.IO.RPC.MessagePack.RPCException instance GHC.Show.Show a => GHC.Show.Show (Z.IO.RPC.MessagePack.Request a) instance GHC.Exception.Type.Exception Z.IO.RPC.MessagePack.RPCException