packstream-bolt-0.1.0.0: PackStream binary serialization format
Safe HaskellNone
LanguageGHC2021

Data.PackStream.Ps

Description

Core PackStream AST: the Ps type and the PackStream type class for converting between Haskell types and PackStream values.

Specification: https://neo4j.com/docs/bolt/current/packstream/

Synopsis

Core types

type Tag = Word8 Source #

Structure tag byte identifying a PackStream structure type.

data Ps Source #

A PackStream value. This is the intermediate AST used for serialization.

Constructors

PsNull

missing or empty value

PsBoolean !Bool

true or false

PsInteger !PSInteger

signed 64-bit integer

PsFloat !Double

64-bit floating point number

PsBytes !ByteString

byte array

PsString !Text

unicode text, UTF-8

PsList !(Vector Ps)

ordered collection of values

PsDictionary !(HashMap Text Ps)

collection of key-value entries (no order guaranteed)

PsStructure !Tag !(Vector Ps)

composite value with a type signature

fields being a Vector is a bit wasteful, but the spec demands it in practice there is always just 1 field, which is a dictionary Control messages all use dictionaries: https://neo4j.com/docs/bolt/current/bolt/message/#messages Datatypes all use dictionaries: https://neo4j.com/docs/bolt/current/bolt/structure-semantics/

Instances

Instances details
Show Ps Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

showsPrec :: Int -> Ps -> ShowS #

show :: Ps -> String #

showList :: [Ps] -> ShowS #

NFData Ps Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

rnf :: Ps -> () #

Eq Ps Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

(==) :: Ps -> Ps -> Bool #

(/=) :: Ps -> Ps -> Bool #

PackStream Ps Source #

The trivial identity PackStream instance

Instance details

Defined in Data.PackStream.Ps

Persist Ps Source #

This Persist instance encodes/decodes to/from PackStream format

Instance details

Defined in Data.PackStream.Ps

Methods

put :: Ps -> Put () #

get :: Get Ps #

unsafePut :: Ps -> Put () #

unsafeGet :: Get Ps #

structFromDict :: Tag -> HashMap Text Ps -> Ps Source #

Build a structure with a single dictionary field.

structureSingleton :: Tag -> Ps -> Ps Source #

Build a structure with exactly one field.

PackStream class

class PackStream a where Source #

Class for converting between PackStream Pss and native Haskell types.

Minimal complete definition

toPs, fromPs

Methods

toPs :: a -> Ps Source #

toBinary :: a -> Put Source #

Encodes directly to Put monad bypassing the intermediate Ps AST

Since: 1.1.0.0

fromPs :: Ps -> Result a Source #

Instances

Instances details
PackStream Int16 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Int32 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Int64 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Int8 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Word16 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Word32 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Word8 Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream ByteString Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream ByteString Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream ShortByteString Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream PSInteger Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Ps Source #

The trivial identity PackStream instance

Instance details

Defined in Data.PackStream.Ps

PackStream Text Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Text Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream String Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream () Source #

Encodes as PsNull

Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: () -> Ps Source #

toBinary :: () -> Put Source #

fromPs :: Ps -> Result () Source #

PackStream Bool Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream Double Source #

This instance decodes 64bit and 32bit floats from PackStream streams into a Double

Instance details

Defined in Data.PackStream.Ps

PackStream Int Source # 
Instance details

Defined in Data.PackStream.Ps

PackStream a => PackStream (NonEmpty a) Source # 
Instance details

Defined in Data.PackStream.Ps

(Generic a, GPackStream (Rep a)) => PackStream (GenericPackStream a) Source # 
Instance details

Defined in Data.PackStream.Generic

PackStream a => PackStream (Vector a) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: Vector a -> Ps Source #

toBinary :: Vector a -> Put Source #

fromPs :: Ps -> Result (Vector a) Source #

PackStream a => PackStream (Maybe a) Source #

Maybes are encoded as nullable types, i.e. Nothing is encoded as nil.

NOTE: Encoding nested Maybes or Maybes enclosing types which encode to nil (such as ()) will break round-tripping

Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: Maybe a -> Ps Source #

toBinary :: Maybe a -> Put Source #

fromPs :: Ps -> Result (Maybe a) Source #

PackStream a => PackStream [a] Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: [a] -> Ps Source #

toBinary :: [a] -> Put Source #

fromPs :: Ps -> Result [a] Source #

PackStream v => PackStream (HashMap Text v) Source # 
Instance details

Defined in Data.PackStream.Ps

(PackStream a1, PackStream a2) => PackStream (a1, a2) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2) -> Ps Source #

toBinary :: (a1, a2) -> Put Source #

fromPs :: Ps -> Result (a1, a2) Source #

(PackStream a1, PackStream a2, PackStream a3) => PackStream (a1, a2, a3) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3) -> Ps Source #

toBinary :: (a1, a2, a3) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3) Source #

(PackStream a1, PackStream a2, PackStream a3, PackStream a4) => PackStream (a1, a2, a3, a4) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3, a4) -> Ps Source #

toBinary :: (a1, a2, a3, a4) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3, a4) Source #

(PackStream a1, PackStream a2, PackStream a3, PackStream a4, PackStream a5) => PackStream (a1, a2, a3, a4, a5) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3, a4, a5) -> Ps Source #

toBinary :: (a1, a2, a3, a4, a5) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3, a4, a5) Source #

(PackStream a1, PackStream a2, PackStream a3, PackStream a4, PackStream a5, PackStream a6) => PackStream (a1, a2, a3, a4, a5, a6) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3, a4, a5, a6) -> Ps Source #

toBinary :: (a1, a2, a3, a4, a5, a6) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3, a4, a5, a6) Source #

(PackStream a1, PackStream a2, PackStream a3, PackStream a4, PackStream a5, PackStream a6, PackStream a7) => PackStream (a1, a2, a3, a4, a5, a6, a7) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3, a4, a5, a6, a7) -> Ps Source #

toBinary :: (a1, a2, a3, a4, a5, a6, a7) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3, a4, a5, a6, a7) Source #

(PackStream a1, PackStream a2, PackStream a3, PackStream a4, PackStream a5, PackStream a6, PackStream a7, PackStream a8) => PackStream (a1, a2, a3, a4, a5, a6, a7, a8) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3, a4, a5, a6, a7, a8) -> Ps Source #

toBinary :: (a1, a2, a3, a4, a5, a6, a7, a8) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3, a4, a5, a6, a7, a8) Source #

(PackStream a1, PackStream a2, PackStream a3, PackStream a4, PackStream a5, PackStream a6, PackStream a7, PackStream a8, PackStream a9) => PackStream (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # 
Instance details

Defined in Data.PackStream.Ps

Methods

toPs :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Ps Source #

toBinary :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Put Source #

fromPs :: Ps -> Result (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source #

Operators

(.:) :: PackStream a => Ps -> Text -> Result a Source #

Look up a key in a PsDictionary and decode the value.

(.=) :: PackStream a => Text -> a -> (Ps, Ps) Source #

Build a key-value pair for constructing a PsDictionary.

Accessors

getPs :: Get Ps Source #

Decode any PackStream value from the binary stream.

putPs :: Ps -> Put Source #

Encode any PackStream value to the binary stream.

Type matching

typeMismatch :: Text -> Ps -> Result a Source #

Report a type mismatch error for the expected type and actual Ps value.

withNull :: Text -> Result a -> Ps -> Result a Source #

Match a PsNull, or report a type mismatch.

withBoolean :: Text -> (Bool -> Result a) -> Ps -> Result a Source #

Match a PsBoolean, or report a type mismatch.

withInteger :: Text -> (PSInteger -> Result a) -> Ps -> Result a Source #

Match a PsInteger, or report a type mismatch.

withFloat :: Text -> (Double -> Result a) -> Ps -> Result a Source #

Match a PsFloat, or report a type mismatch.

withBytes :: Text -> (ByteString -> Result a) -> Ps -> Result a Source #

Match a PsBytes, or report a type mismatch.

withString :: Text -> (Text -> Result a) -> Ps -> Result a Source #

Match a PsString, or report a type mismatch.

withList :: Text -> (Vector Ps -> Result a) -> Ps -> Result a Source #

Match a PsList, or report a type mismatch.

withDictionary :: Text -> (HashMap Text Ps -> Result a) -> Ps -> Result a Source #

Match a PsDictionary, or report a type mismatch.