pinch-0.1.0.1: An alternative implementation of Thrift for Haskell.

Copyright(c) Abhinav Gupta 2015
LicenseBSD3
MaintainerAbhinav Gupta <mail@abhinavg.net>
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Pinch.Internal.Pinchable

Description

Provides the core Pinchable typeclass and the GPinchable typeclass used to derive instances automatically.

Synopsis

Documentation

class IsTType (Tag a) => Pinchable a where Source

The Pinchable type class is implemented by types that can be sent or received over the wire as Thrift payloads.

Minimal complete definition

Nothing

Associated Types

type Tag a Source

TType tag for this type.

For most custom types, this will be TStruct, TUnion, or TException. For enums, it will be TEnum. If the instance automatically derived with use of Generic, this is not required because it is automatically determined by use of Field or Enumeration.

Methods

pinch :: a -> Value (Tag a) Source

Convert an a into a Value.

For structs, struct, .=, and ?= may be used to construct Value objects tagged with TStruct.

unpinch :: Value (Tag a) -> Either String a Source

Read a Value back into an a.

For structs, .: and .:? may be used to retrieve field values.

(.=) :: Pinchable a => Int16 -> a -> FieldPair Source

Construct a FieldPair from a field identifier and a Pinchable value.

(?=) :: Pinchable a => Int16 -> Maybe a -> FieldPair Source

Construct a FieldPair from a field identifier and an optional Pinchable value.

struct :: [FieldPair] -> Value TStruct Source

Construct a Value tagged with a TStruct from the given key-value pairs. Optional fields whose values were omitted will be ignored.

struct [1 .= ("Hello" :: Text), 2 .= (42 :: Int16)]

union :: Pinchable a => Int16 -> a -> Value TUnion Source

Constructs a Value tagged with TUnion.

union 1 ("foo" :: ByteString)

type FieldPair = (Int16, Maybe SomeValue) Source

A pair of field identifier and maybe a value stored in the field. If the value is absent, the field will be ignored.

(.:) :: forall a. Pinchable a => Value TStruct -> Int16 -> Either String a Source

Given a field ID and a Value TStruct, get the value stored in the struct under that field ID. The lookup fails if the field is absent or if it's not the same type as expected by this call's context.

(.:?) :: forall a. Pinchable a => Value TStruct -> Int16 -> Either String (Maybe a) Source

Given a field ID and a Value TStruct, get the optional value stored in the struct under the given field ID. The value returned is Nothing if it was absent or the wrong type. The lookup fails only if the value retrieved fails to unpinch.

class IsTType (GTag f) => GPinchable f where Source

GPinchable is used to impelment support for automatically deriving instances of Pinchable via generics.

Associated Types

type GTag f Source

TType tag to use for objects of this type.

Methods

gPinch :: f a -> Value (GTag f) Source

Converts a generic representation of a value into a Value.

gUnpinch :: Value (GTag f) -> Either String (f a) Source

Converts a Value back into the generic representation of the object.

genericPinch :: (Generic a, GPinchable (Rep a)) => a -> Value (GTag (Rep a)) Source

Implementation of pinch based on GPinchable.

genericUnpinch :: (Generic a, GPinchable (Rep a)) => Value (GTag (Rep a)) -> Either String a Source

Implementation of unpinch based on GPinchable.