pinch: An alternative implementation of Thrift for Haskell.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

This library provides machinery for types to specify how they can be serialized and deserialized into/from Thrift payloads. It makes no assumptions on how these payloads are sent or received and performs no code generation. Types may specify how to be serialized and deserialized by defining instances of the Pinchable typeclass by hand, with automatically derived instances by using generics or by using the pinch-gen code generator. Check the documentation in the Pinch module for more information.

What is Thrift? Apache Thrift provides an interface description language, a set of communication protocols, and a code generator and libraries for various programming languages to interact with the generated code. Pinch aims to provide an alternative implementation of Thrift for Haskell.


[Skip to Readme]

Properties

Versions 0.1.0.0, 0.1.0.1, 0.1.0.2, 0.2.0.0, 0.2.0.1, 0.2.0.2, 0.3.0.0, 0.3.0.1, 0.3.0.2, 0.3.1.0, 0.3.2.0, 0.3.3.0, 0.3.4.0, 0.3.4.1, 0.3.5.0, 0.4.0.0, 0.4.1.0, 0.4.1.1, 0.4.1.2, 0.4.2.0, 0.4.3.0, 0.4.3.0, 0.5.0.0, 0.5.1.0, 0.5.2.0
Change log CHANGES.md
Dependencies array (>=0.5), base (>=4.7 && <5), bytestring (>=0.10 && <0.12), cereal (>=0.5.8.1 && <0.6), containers (>=0.5 && <0.7), deepseq (>=1.3 && <1.5), ghc-prim, hashable (>=1.2 && <1.5), network (>=3.1.2.0 && <3.2), semigroups (>=0.18 && <0.21), text (>=1.2 && <1.3 || >=2.0), unordered-containers (>=0.2 && <0.3), vector (>=0.10 && <0.14) [details]
License BSD-3-Clause
Author Abhinav Gupta
Maintainer mail@abhinavg.net
Category Development
Home page https://github.com/abhinav/pinch#readme
Bug tracker https://github.com/abhinav/pinch/issues
Source repo head: git clone https://github.com/abhinav/pinch
Uploaded by abhinav at 2023-04-27T19:20:54Z

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for pinch-0.4.3.0

[back to package description]

build

pinch aims to provide an alternative implementation of Apache Thrift for Haskell. The pinch library itself acts only as a serialization library. Types specify their Thrift encoding by defining instances of the Pinchable typeclass, which may be done by hand or automatically with the use of Generics.

Haddock documentation for this package is avilable on Hackage and here.

Overview

Types which can be encoded into Thrift payloads implement the Pinchable typeclass.

Given the Thrift struct,

struct Person {
    1: required string name
    2: optional i64 dateOfBirth
}

You can write a Pinchable instance like so,

data Person = Person { name :: Text, dateOfBirth :: Maybe Int64 }
    deriving (Eq)

instance Pinchable Person where
    type Tag Person = TStruct
    -- The Tag tells the system that this represents a struct.

    pinch (Person name dateOfBirth) =
        struct [1 .= name, 2 ?= dateOfBirth]

    unpinch value =
        Person <$> value .:  1
               <*> value .:? 2

Better yet, you can drive an instance automatically.

{-# LANGUAGE DeriveGeneric, DataKinds #-}
import GHC.Generics (Generic)

data Person = Person
    { name        :: Field 1 Text
    , dateOfBirth :: Field 2 (Maybe Int64)
    } deriving (Eq, Generic)

instance Pinchable Person

Objects can be serialized and deserialized using the encode and decode methods. These methods accept a Protocol as an argument.

decode binaryProtocol (encode binaryProtocol person) == person

For more information, check the documentation and the examples.

Supported Protocols

The following Thrift protocols are supported:

Supported Transports

The following Thrift transports are supported:

Code Generation

If you prefer to generate Haskell code from the Thrift files instead of writing the necessary Haskell code by hand, you can use the experimental pinch-gen code generator to do so. For further details see https://github.com/phile314/pinch-gen/ .