packages feed

hw-kafka-avro 1.2.0 → 1.3.0

raw patch · 5 files changed

+51/−16 lines, 5 filesdep +http-typesPVP ok

version bump matches the API change (PVP)

Dependencies added: http-types

API changes (from Hackage documentation)

+ Kafka.Avro: propagateKeySchema :: MonadIO m => SchemaRegistry -> Subject -> ByteString -> m (Either SchemaRegistryError (Maybe SchemaId))
+ Kafka.Avro: propagateValueSchema :: MonadIO m => SchemaRegistry -> Subject -> ByteString -> m (Either SchemaRegistryError (Maybe SchemaId))
+ Kafka.Avro.Decode: extractSchemaId :: ByteString -> Maybe (SchemaId, ByteString)
+ Kafka.Avro.Encode: keySubject :: Subject -> Subject
+ Kafka.Avro.Encode: valueSubject :: Subject -> Subject
+ Kafka.Avro.SchemaRegistry: SchemaRegistrySchemaNotFound :: SchemaId -> SchemaRegistryError

Files

hw-kafka-avro.cabal view
@@ -1,5 +1,5 @@ name:                hw-kafka-avro-version:             1.2.0+version:             1.3.0 synopsis:            Avro support for Kafka infrastructure description:         Please see README.md homepage:            https://github.com/haskell-works/hw-kafka-avro#readme@@ -35,6 +35,7 @@                        errors,                        hashable,                        http-client,+                       http-types,                        mtl,                        pure-zlib >= 0.6,                        semigroups,
src/Kafka/Avro.hs view
@@ -1,7 +1,37 @@ module Kafka.Avro ( module X+, propagateKeySchema+, propagateValueSchema ) where +import Control.Monad.IO.Class+import Data.ByteString.Lazy++import Kafka.Avro.Decode         as X+import Kafka.Avro.Encode         as X import Kafka.Avro.SchemaRegistry as X-import Kafka.Avro.Decode as X-import Kafka.Avro.Encode as X++-- | Registers schema that was used for a given payload against the specified subject as a key shema.+-- It is possible that a given payload doesn't have schema registered against it, in this case no prapagation happens.+propagateKeySchema :: MonadIO m => SchemaRegistry -> Subject -> ByteString -> m (Either SchemaRegistryError (Maybe SchemaId))+propagateKeySchema sr subj = propagateSchema sr (keySubject subj)++-- | Registers schema that was used for a given payload against the specified subject as a value schema.+-- It is possible that a given payload doesn't have schema registered against it, in this case no prapagation happens.+propagateValueSchema :: MonadIO m => SchemaRegistry -> Subject -> ByteString -> m (Either SchemaRegistryError (Maybe SchemaId))+propagateValueSchema sr subj = propagateSchema sr (valueSubject subj)++propagateSchema :: MonadIO m+                => SchemaRegistry+                -> Subject+                -> ByteString+                -> m (Either SchemaRegistryError (Maybe SchemaId))+propagateSchema sr subj bs = do+  case extractSchemaId bs of+    Nothing -> return $ Right Nothing+    Just (sid, _) -> do+      mSchema <- loadSchema sr sid+      case mSchema of+        Left (SchemaRegistrySchemaNotFound _) -> return $ Right Nothing+        Left err                              -> return $ Left err+        Right schema                          -> fmap Just <$> sendSchema sr subj schema
src/Kafka/Avro/Decode.hs view
@@ -1,7 +1,7 @@ module Kafka.Avro.Decode (   DecodeError(..)-, decodeWithSchema+, decodeWithSchema, extractSchemaId ) where  import           Control.Monad.IO.Class    (MonadIO)
src/Kafka/Avro/Encode.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} module Kafka.Avro.Encode ( encodeKey, encodeValue+, keySubject, valueSubject , encodeWithSchema , EncodeError(..) ) where@@ -18,6 +19,12 @@ data EncodeError = EncodeRegistryError SchemaRegistryError   deriving (Show, Eq) +keySubject :: Subject -> Subject+keySubject (Subject subj) = Subject (subj <> "-key")++valueSubject :: Subject -> Subject+valueSubject (Subject subj) = Subject (subj <> "-value")+ -- | Encodes a provided value as a message key. -- -- Registers the schema in SchemaRegistry with "<subject>-key" subject.@@ -26,9 +33,7 @@           -> Subject           -> a           -> m (Either EncodeError ByteString)-encodeKey sr (Subject subj) a =-  let keySubj = Subject (subj <> "-key")-   in encodeWithSchema sr keySubj a+encodeKey sr subj = encodeWithSchema sr (keySubject subj)  -- | Encodes a provided value as a message value. --@@ -38,9 +43,7 @@             -> Subject             -> a             -> m (Either EncodeError ByteString)-encodeValue sr (Subject subj) a =-  let valSubj = Subject (subj <> "-value")-   in encodeWithSchema sr valSubj a+encodeValue sr subj = encodeWithSchema sr (valueSubject subj)  -- | Encodes a provided value into Avro -- and registers value's schema in SchemaRegistry.
src/Kafka/Avro/SchemaRegistry.hs view
@@ -27,6 +27,7 @@ import           GHC.Exception import           GHC.Generics               (Generic) import           Network.HTTP.Client        (Manager, defaultManagerSettings, newManager)+import           Network.HTTP.Types import           Servant.API import           Servant.Client @@ -51,6 +52,7 @@ data SchemaRegistryError = SchemaRegistryConnectError String                          | SchemaDecodeError SchemaId String                          | SchemaRegistryLoadError SchemaId+                         | SchemaRegistrySchemaNotFound SchemaId                          | SchemaRegistryError SchemaId                          | SchemaRegistrySendError String                          deriving (Show, Eq)@@ -115,8 +117,6 @@ #endif getSchemaById :<|> putSchema = client api -type P = ServantError- #if MIN_VERSION_servant(0,9,1) sendSchemaToSR :: MonadIO m => ClientEnv -> Subject -> Schema -> m (Either SchemaRegistryError SchemaId) sendSchemaToSR env subj s =@@ -144,10 +144,11 @@   where     unwrapResponse (RegisteredSchema s) = s     toSRError msg = case msg of-      ConnectionError ex   -> SchemaRegistryConnectError (show ex)-      FailureResponse{}    -> SchemaRegistryLoadError sid-      DecodeFailure de _ _ -> SchemaDecodeError sid de-      _                    -> SchemaRegistryLoadError sid+      ConnectionError ex                                       -> SchemaRegistryConnectError (show ex)+      FailureResponse {responseStatus=Status {statusCode=404}} -> SchemaRegistrySchemaNotFound sid+      FailureResponse{}                                        -> SchemaRegistryLoadError sid+      DecodeFailure de _ _                                     -> SchemaDecodeError sid de+      _                                                        -> SchemaRegistryLoadError sid  --------------------------------------------------------------------- fullTypeName :: Schema -> SchemaName