{-# LANGUAGE TemplateHaskell #-}
module Codec.Binary.Bech32.TH
(
humanReadablePart
) where
import Prelude
import Codec.Binary.Bech32
( HumanReadablePart, humanReadablePartFromText, humanReadablePartToText )
import Control.Exception
( throw )
import Data.Text
( Text )
import Language.Haskell.TH.Quote
( QuasiQuoter (..) )
import Language.Haskell.TH.Syntax
( Exp, Q )
import qualified Data.Text as T
humanReadablePart :: QuasiQuoter
humanReadablePart = QuasiQuoter
{ quoteExp = quoteHumanReadablePart
, quotePat = notHandled "patterns"
, quoteType = notHandled "types"
, quoteDec = notHandled "declarations"
}
where
notHandled things =
error $ things <>
" are not handled by the Bech32 humanReadablePart quasiquoter."
quoteHumanReadablePart :: String -> Q Exp
quoteHumanReadablePart = quote
. T.unpack
. humanReadablePartToText
. unsafeHumanReadablePart
. T.pack
where
quote t = [| unsafeHumanReadablePart t |]
unsafeHumanReadablePart :: Text -> HumanReadablePart
unsafeHumanReadablePart = either throw id . humanReadablePartFromText