module Serokell.Util.Base16
( encode
, decode
, formatBase16
, base16F
) where
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as B16
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import Data.Text.Lazy.Builder (Builder, fromText)
import Formatting (Format, later, sformat, stext, (%))
encode :: BS.ByteString -> T.Text
encode = TE.decodeUtf8 . B16.encode
decode :: T.Text -> Either T.Text BS.ByteString
decode = handleError . B16.decode . TE.encodeUtf8
where
handleError (res,rest)
| BS.null rest = pure res
| otherwise =
Left $
sformat
("suffix is not in base-16 format: " % stext)
(TE.decodeUtf8 rest)
formatBase16 :: BS.ByteString -> Builder
formatBase16 = fromText . encode
base16F :: Format r (BS.ByteString -> r)
base16F = later formatBase16