packages feed

rdkafka-hs-1.1.0.0: src/Kafka/Version.hs

-- | The version of the librdkafka C library this program is linked against.
--
-- rdkafka-hs requires librdkafka 2.15 or newer; the build refuses an older
-- library at configure time. These values come from the library loaded at run
-- time, which can be newer than the headers the package was compiled with.
module Kafka.Version
  ( LibrdkafkaVersion (..),
    librdkafkaVersion,
    librdkafkaVersionNumber,
    librdkafkaVersionParts,
    decodeLibrdkafkaVersion,
  )
where

import Data.Bits (shiftR, (.&.))
import Data.Text (Text)
import Data.Text qualified as Text
import Kafka.Internal.RdKafka (rdKafkaVersion, rdKafkaVersionStr)

-- | A decoded librdkafka version number.
data LibrdkafkaVersion = LibrdkafkaVersion
  { versionMajor :: Int,
    versionMinor :: Int,
    versionRevision :: Int
  }
  deriving stock (Eq, Ord, Show)

-- | The linked library's version string, for example @"2.15.0"@
-- (@rd_kafka_version_str@).
librdkafkaVersion :: Text
librdkafkaVersion = Text.pack rdKafkaVersionStr

-- | The linked library's version number in librdkafka's hex encoding
-- @0xMMmmrrpp@ (major, minor, revision, pre-release), for example
-- @0x020f00ff@ for 2.15.0 (@rd_kafka_version@).
librdkafkaVersionNumber :: Int
librdkafkaVersionNumber = rdKafkaVersion

-- | The linked library's version, decoded from 'librdkafkaVersionNumber'.
librdkafkaVersionParts :: LibrdkafkaVersion
librdkafkaVersionParts = decodeLibrdkafkaVersion librdkafkaVersionNumber

-- | Decode librdkafka's @0xMMmmrrpp@ version encoding. The pre-release byte is
-- ignored.
decodeLibrdkafkaVersion :: Int -> LibrdkafkaVersion
decodeLibrdkafkaVersion n =
  LibrdkafkaVersion
    { versionMajor = (n `shiftR` 24) .&. 0xff,
      versionMinor = (n `shiftR` 16) .&. 0xff,
      versionRevision = (n `shiftR` 8) .&. 0xff
    }