{-# LANGUAGE DeriveAnyClass      #-}
{-# LANGUAGE DeriveGeneric       #-}
{-# LANGUAGE DeriveTraversable   #-}
{-# LANGUAGE NumDecimals         #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE QuasiQuotes         #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving  #-}
{-# LANGUAGE StrictData          #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE TupleSections       #-}
{-# LANGUAGE TypeApplications    #-}

module Avro.Data.Enums
where

import Data.Avro.Deriving (deriveAvroFromByteString, r)

import Hedgehog
import Hedgehog.Gen   as Gen
import Hedgehog.Range as Range

deriveAvroFromByteString [r|
{
  "type": "record",
  "name": "EnumWrapper",
  "namespace": "haskell.avro.example",
  "fields": [
    { "name": "id",     "type": "long" },
    { "name": "name",   "type": "string"},
    { "name": "reason",
    "type": {
        "type": "enum",
        "name": "EnumReason",
        "symbols": ["Because", "Instead"]
      }
    }
  ]
}
|]

enumWrapperGen :: MonadGen m => m EnumWrapper
enumWrapperGen = EnumWrapper
  <$> Gen.int64 Range.linearBounded
  <*> Gen.text (Range.linear 0 128) Gen.alphaNum
  <*> Gen.enumBounded

