-- | Wrap Data.Text
--
-- We plan to replace it with Haskus.Text in the future
module Haskus.Utils.Text
   ( module Data.Text
   -- * Conversions
   , bufferDecodeUtf8
   , textEncodeUtf8
   , stringEncodeUtf8
   -- * Formatting
   , textFormat
   , F.Format
   , (F.%)
   , (F.%.)
   , module Formatting.Formatters
   -- * Parsing
   , textParseHexadecimal
   -- * Get/Put
   , putTextUtf8
   , getTextUtf8
   , getTextUtf8Nul
   , tshow
   -- * IO
   , T.putStrLn
   )
where

import Data.Text hiding (center)
import qualified Data.Text.Encoding as T
import qualified Data.Text          as T
import qualified Data.Text.IO       as T
import Formatting                   as F
import Formatting.Formatters
import Data.Text.Read               as T

import Haskus.Binary.Buffer
import Haskus.Binary.Put
import Haskus.Binary.Get

-- | Decode Utf8
bufferDecodeUtf8 :: Buffer -> Text
bufferDecodeUtf8 (Buffer bs) = T.decodeUtf8 bs

-- | Encode Text into Utf8
textEncodeUtf8 :: Text -> Buffer
textEncodeUtf8 = Buffer . T.encodeUtf8

-- | Encode String into Utf8
stringEncodeUtf8 :: String -> Buffer
stringEncodeUtf8 = textEncodeUtf8 . T.pack

-- | Format a text (strict)
textFormat :: Format Text a -> a
textFormat = F.sformat

-- | Parse an hexadecimal number
-- FIXME: use a real parser (MegaParsec, etc.)
textParseHexadecimal :: Integral a => Text -> Either String a
textParseHexadecimal s = fst <$> T.hexadecimal s

-- | Put an UTF8 encoded text
putTextUtf8 :: Text -> Put
putTextUtf8 = putBuffer . textEncodeUtf8

-- | Pull n bytes from the input, as a Buffer
getTextUtf8 :: Word -> Get Text
getTextUtf8 sz = bufferDecodeUtf8 <$> getBuffer sz

-- | Pull \0 terminal text
getTextUtf8Nul :: Get Text
getTextUtf8Nul = bufferDecodeUtf8 <$> getBufferNul

-- | Show as Text
tshow :: Show a => a -> Text
tshow = pack . show