avro-0.3.2.0: Avro serialization support for Haskell

Safe HaskellNone
LanguageHaskell2010

Data.Avro

Description

Avro encoding and decoding routines.

This library provides a high level interface for encoding (and decoding) Haskell values in Apache's Avro serialization format. The goal is to match Aeson's API whenever reasonable, meaning user experience with one effectively translate to the other.

Avro RPC is not currently supported.

  • *Library Structure**

The library structure includes: * This module, Avro, providing a high-level interface via classes of FromAvro and ToAvro for decoding and encoding values. * Type define the types of Avro data, providing a common (intermediate) representation for any data that is encoded or decoded by Data.Avro. * Encode and Decode: More efficient conversion capable of avoiding the intermediate representation. Also, the implementation of the en/decoding of the intermediate representation. * Deconflict: translate decoded data from an encoder schema to the (potentially different) decoder's schema. * Schema: Defines the type for Avro schema's and its JSON encoding/decoding.

Example decoding:

Let's say you have an ADT and related schema:

{--}
import qualified Data.Avro.Types as Ty
import Data.Avro.Schema
import Data.Avro
import           Data.List.NonEmpty (NonEmpty(..))

data MyEnum = A | B | C | D deriving (Eq,Ord,Show,Enum,Generic)
data MyStruct = MyStruct (Either MyEnum String) Int

meSchema :: Schema
meSchema = Schema $ mkEnum MyEnum [] Nothing Nothing [A,B,C,D]

msSchema  :: Schema
msSchema =
  Struct MyStruct Nothing [] Nothing Nothing
      [ fld "enumOrString" eOrS (Just $ String "The Default")
      , fld "int" Int (Just (Ty.Int 1))
      ]
     where
     fld nm ty def = Field nm [] Nothing Nothing ty def
     eOrS = mkUnion (meSchema :| [String])

instance ToAvro MyEnum where
    toAvro = toAvroEnum
instance ToAvro MyStruct where
    toAvro (MyStruct ab i) =
     record [ "enumOrString" .= ab
            , "int"          .= i
            ]

main = do
  let val = MyStruct (Right Hello) 1
  print (fromAvro (toAvro val) == Success val)

Synopsis

Documentation

class HasAvroSchema a => FromAvro a where #

Minimal complete definition

fromAvro

Methods

fromAvro :: Value Type -> Result a #

Instances
FromAvro Bool # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro Double # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro Float # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro Int # 
Instance details

Defined in Data.Avro.FromAvro

Methods

fromAvro :: Value Type -> Result Int #

FromAvro Int32 # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro Int64 # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro ByteString # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro ByteString # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro Text # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro Text # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro a => FromAvro [a] # 
Instance details

Defined in Data.Avro.FromAvro

Methods

fromAvro :: Value Type -> Result [a] #

FromAvro a => FromAvro (Maybe a) # 
Instance details

Defined in Data.Avro.FromAvro

Methods

fromAvro :: Value Type -> Result (Maybe a) #

(FromAvro a, FromAvro b) => FromAvro (Either a b) # 
Instance details

Defined in Data.Avro.FromAvro

Methods

fromAvro :: Value Type -> Result (Either a b) #

FromAvro a => FromAvro (HashMap Text a) # 
Instance details

Defined in Data.Avro.FromAvro

FromAvro a => FromAvro (Map Text a) # 
Instance details

Defined in Data.Avro.FromAvro

Methods

fromAvro :: Value Type -> Result (Map Text a) #

class HasAvroSchema a => ToAvro a where #

Minimal complete definition

toAvro

Methods

toAvro :: a -> Value Type #

Instances
ToAvro Bool # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Bool -> Value Type #

ToAvro Double # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Double -> Value Type #

ToAvro Float # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Float -> Value Type #

ToAvro Int # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Int -> Value Type #

ToAvro Int32 # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Int32 -> Value Type #

ToAvro Int64 # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Int64 -> Value Type #

ToAvro () # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: () -> Value Type #

ToAvro ByteString # 
Instance details

Defined in Data.Avro.ToAvro

ToAvro ByteString # 
Instance details

Defined in Data.Avro.ToAvro

ToAvro Text # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Text -> Value Type #

ToAvro Text # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Text -> Value Type #

ToAvro a => ToAvro [a] # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: [a] -> Value Type #

ToAvro a => ToAvro (Maybe a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Maybe a -> Value Type #

(ToAvro a, ToAvro b) => ToAvro (Either a b) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Either a b -> Value Type #

ToAvro a => ToAvro (HashMap String a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: HashMap String a -> Value Type #

ToAvro a => ToAvro (HashMap Text a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: HashMap Text a -> Value Type #

ToAvro a => ToAvro (HashMap Text a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: HashMap Text a -> Value Type #

ToAvro a => ToAvro (Map String a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Map String a -> Value Type #

ToAvro a => ToAvro (Map Text a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Map Text a -> Value Type #

ToAvro a => ToAvro (Map Text a) # 
Instance details

Defined in Data.Avro.ToAvro

Methods

toAvro :: Map Text a -> Value Type #

class HasAvroSchema a where #

Minimal complete definition

schema

Methods

schema :: Tagged a Type #

Instances
HasAvroSchema Bool # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged Bool Type #

HasAvroSchema Double # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Float # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Int # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged Int Type #

HasAvroSchema Int8 # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged Int8 Type #

HasAvroSchema Int16 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Int32 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Int64 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Word8 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Word16 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Word32 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Word64 # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema () # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged () Type #

HasAvroSchema ByteString # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema ByteString # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema Text # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged Text Type #

HasAvroSchema Text # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged Text Type #

HasAvroSchema a => HasAvroSchema [a] # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged [a] Type #

HasAvroSchema a => HasAvroSchema (Maybe a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Maybe a) Type #

HasAvroSchema a => HasAvroSchema (Set a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Set a) Type #

HasAvroSchema a => HasAvroSchema (Vector a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Vector a) Type #

HasAvroSchema a => HasAvroSchema (Vector a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Vector a) Type #

(HasAvroSchema a, HasAvroSchema b) => HasAvroSchema (Either a b) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Either a b) Type #

HasAvroSchema a => HasAvroSchema (HashMap String a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

HasAvroSchema a => HasAvroSchema (HashMap Text a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (HashMap Text a) Type #

HasAvroSchema a => HasAvroSchema (HashMap Text a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (HashMap Text a) Type #

HasAvroSchema a => HasAvroSchema (Map String a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Map String a) Type #

HasAvroSchema a => HasAvroSchema (Map Text a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Map Text a) Type #

HasAvroSchema a => HasAvroSchema (Map Text a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Map Text a) Type #

(HasAvroSchema a, Ix i) => HasAvroSchema (Array i a) # 
Instance details

Defined in Data.Avro.HasAvroSchema

Methods

schema :: Tagged (Array i a) Type #

type Avro a = (FromAvro a, ToAvro a) #

(.=) :: ToAvro a => Text -> a -> (Text, Value Type) #

data Result a #

Constructors

Success a 
Error String 
Instances
Monad Result # 
Instance details

Defined in Data.Avro.Schema

Methods

(>>=) :: Result a -> (a -> Result b) -> Result b #

(>>) :: Result a -> Result b -> Result b #

return :: a -> Result a #

fail :: String -> Result a #

Functor Result # 
Instance details

Defined in Data.Avro.Schema

Methods

fmap :: (a -> b) -> Result a -> Result b #

(<$) :: a -> Result b -> Result a #

MonadFail Result # 
Instance details

Defined in Data.Avro.Schema

Methods

fail :: String -> Result a #

Applicative Result # 
Instance details

Defined in Data.Avro.Schema

Methods

pure :: a -> Result a #

(<*>) :: Result (a -> b) -> Result a -> Result b #

liftA2 :: (a -> b -> c) -> Result a -> Result b -> Result c #

(*>) :: Result a -> Result b -> Result b #

(<*) :: Result a -> Result b -> Result a #

Foldable Result # 
Instance details

Defined in Data.Avro.Schema

Methods

fold :: Monoid m => Result m -> m #

foldMap :: Monoid m => (a -> m) -> Result a -> m #

foldr :: (a -> b -> b) -> b -> Result a -> b #

foldr' :: (a -> b -> b) -> b -> Result a -> b #

foldl :: (b -> a -> b) -> b -> Result a -> b #

foldl' :: (b -> a -> b) -> b -> Result a -> b #

foldr1 :: (a -> a -> a) -> Result a -> a #

foldl1 :: (a -> a -> a) -> Result a -> a #

toList :: Result a -> [a] #

null :: Result a -> Bool #

length :: Result a -> Int #

elem :: Eq a => a -> Result a -> Bool #

maximum :: Ord a => Result a -> a #

minimum :: Ord a => Result a -> a #

sum :: Num a => Result a -> a #

product :: Num a => Result a -> a #

Traversable Result # 
Instance details

Defined in Data.Avro.Schema

Methods

traverse :: Applicative f => (a -> f b) -> Result a -> f (Result b) #

sequenceA :: Applicative f => Result (f a) -> f (Result a) #

mapM :: Monad m => (a -> m b) -> Result a -> m (Result b) #

sequence :: Monad m => Result (m a) -> m (Result a) #

Alternative Result # 
Instance details

Defined in Data.Avro.Schema

Methods

empty :: Result a #

(<|>) :: Result a -> Result a -> Result a #

some :: Result a -> Result [a] #

many :: Result a -> Result [a] #

MonadPlus Result # 
Instance details

Defined in Data.Avro.Schema

Methods

mzero :: Result a #

mplus :: Result a -> Result a -> Result a #

MonadError String Result # 
Instance details

Defined in Data.Avro.Schema

Methods

throwError :: String -> Result a #

catchError :: Result a -> (String -> Result a) -> Result a #

Eq a => Eq (Result a) # 
Instance details

Defined in Data.Avro.Schema

Methods

(==) :: Result a -> Result a -> Bool #

(/=) :: Result a -> Result a -> Bool #

Ord a => Ord (Result a) # 
Instance details

Defined in Data.Avro.Schema

Methods

compare :: Result a -> Result a -> Ordering #

(<) :: Result a -> Result a -> Bool #

(<=) :: Result a -> Result a -> Bool #

(>) :: Result a -> Result a -> Bool #

(>=) :: Result a -> Result a -> Bool #

max :: Result a -> Result a -> Result a #

min :: Result a -> Result a -> Result a #

Show a => Show (Result a) # 
Instance details

Defined in Data.Avro.Schema

Methods

showsPrec :: Int -> Result a -> ShowS #

show :: Result a -> String #

showList :: [Result a] -> ShowS #

Semigroup (Result a) # 
Instance details

Defined in Data.Avro.Schema

Methods

(<>) :: Result a -> Result a -> Result a #

sconcat :: NonEmpty (Result a) -> Result a #

stimes :: Integral b => b -> Result a -> Result a #

Monoid (Result a) # 
Instance details

Defined in Data.Avro.Schema

Methods

mempty :: Result a #

mappend :: Result a -> Result a -> Result a #

mconcat :: [Result a] -> Result a #

decode :: forall a. FromAvro a => ByteString -> Result a #

Decode a lazy bytestring using a Schema for the return type.

decodeWithSchema :: FromAvro a => Schema -> ByteString -> Result a #

Decode a lazy bytestring with a provided schema

decodeContainer :: forall a. FromAvro a => ByteString -> [[a]] #

Decode a container and de-conflict the writer schema with a reader schema for a return type. Like in decodeContainerWithSchema exceptions are thrown instead of a Result type to allow this function to be read lazy (to be done in some later version).

decodeContainerWithSchema :: FromAvro a => Schema -> ByteString -> [[a]] #

Decode a container and de-conflict the writer schema with a given reader-schema. Exceptions are thrown instead of a Result type to allow this function to be read lazy (to be done in some later version).

decodeContainerBytes :: ByteString -> [[ByteString]] #

Like decodeContainer but returns the avro-encoded bytes for each object in the container instead of the Haskell type.

This is particularly useful when slicing up containers into one or more smaller files. By extracting the original bytestring it is possible to avoid re-encoding data.

encode :: ToAvro a => a -> ByteString #

Encodes a value to a lazy ByteString

encodeContainer :: forall a. ToAvro a => [[a]] -> IO ByteString #

Encode chunks of objects into a container, using 16 random bytes for the synchronization markers.

encodeContainerWithSync :: forall a. ToAvro a => (Word64, Word64, Word64, Word64) -> [[a]] -> ByteString #

Encode chunks of objects into a container, using the provided ByteString as the synchronization markers