packages feed

btc-lsp-0.1.0.0: src/BtcLsp/Text.hs

module BtcLsp.Text
  ( toHex,
    toQr,
    displayRational,
    mkHtmlUuid,
  )
where

import BtcLsp.Import.External
import qualified Codec.QRCode as QR
  ( ErrorLevel (L),
    TextEncoding (Iso8859_1OrUtf8WithoutECI),
    defaultQRCodeOptions,
    encodeAutomatic,
  )
import qualified Codec.QRCode.JuicyPixels as JP
  ( toPngDataUrlT,
  )
import qualified Data.ByteString.Base16 as B16
import qualified Data.Text.Format.Numbers as F
import qualified Data.UUID as UUID
import qualified Data.UUID.V4 as UUID
import qualified Language.Haskell.TH.Syntax as TH

toHex :: ByteString -> Text
toHex =
  decodeUtf8
    . B16.encode

toQr :: Text -> Maybe Text
toQr =
  (toStrict . JP.toPngDataUrlT 4 5 <$>)
    . QR.encodeAutomatic
      (QR.defaultQRCodeOptions QR.L)
      QR.Iso8859_1OrUtf8WithoutECI

displayRational :: Int -> Rational -> Text
displayRational len =
  F.prettyF
    F.PrettyCfg
      { F.pc_decimals = len,
        F.pc_thousandsSep = Just ',',
        F.pc_decimalSep = '.'
      }

mkHtmlUuid :: TH.Q TH.Exp
mkHtmlUuid =
  TH.lift
    . ("uuid-" <>)
    . UUID.toText
    =<< TH.runIO UUID.nextRandom